一個矩陣元素的“鞍點”是指該位置上的元素值在該行上最大、在該列上最小。
本題要求編寫程式,求一個給定的n階方陣的鞍點。
輸入格式:
輸入第一行給出一個正整數n(1≤n≤6)。随後n行,每行給出n個整數,其間以空格分隔。
輸出格式:
輸出在一行中按照“行下标 列下标”(下标從0開始)的格式輸出鞍點的位置。如果鞍點不存在,則輸出“NONE”。題目保證給出的矩陣至多存在一個鞍點
#include<stdio.h>
int main()
{
int n,i,j,count=0;
scanf("%d",&n);
int a[n][n];
int b[n][n];//聲明一個輔助數組
for(i=0;i<n;i++)
{
for(j=0;j<n;j++)
{
scanf("%d",&a[i][j]);
b[i][j]=0;//令輔助數組都為0
}
}
int x;
for(i=0;i<n;i++)
{
x=0;
for(j=1;j<n;j++)
{
if(a[i][j]>a[i][x])
x=j;
}//找到行中最大值下标
for(j=0;j<n;j++)
{
if(a[i][j]==a[i][x])
b[i][j]++;
}//讓所有的最大值都加一
}
for(i=0;i<n;i++)
{
x=0;
for(j=1;j<n;j++)
{
if(a[j][i]<a[x][i])
x=j;
}//找到列中最小值下标
for(j=0;j<n;j++)
{
if(a[j][i]==a[x][i])
b[j][i]++;
}//讓所有的最小值都加一
}
for(i=0;i<n;i++)
{
for(j=0;j<n;j++)
{
if(b[i][j]==2)//判斷輔助數組中數是否為2,如果為2則為鞍點。
{
printf("%d %d",i,j);
count++;//計數判斷無鞍點時
}
}
}
if(count==0)
printf("NONE");
return 0;
}
讓輔助函數初始化為0為了更好判定鞍點。
思路:先将每行的所有的最大值找到,然後對應其下标,讓對應的輔助數組的值加一(這裡輔助數組的初始化所有值為0),然後再找到所有列的最小值,讓對應的輔助數組的值加一,這是輔助數組裡所儲存的值有三種(0,1,2),0對應既不是行最大值,也不是列最小值;1對應是行最大值或者列最小值;2對應既是行最大值也是列最小值(也就是鞍點),所有這時隻要判斷輔助數組2所儲存的位置既是鞍點所在的位置。