找鞍点。输入1个正整数n ((1≤n≤6))和n阶方阵a中的元素,假设方阵a最多有1个鞍点,如果找到a的鞍点,就输出其下标,否则,输出“NO”。鞍点的元素值在该行上最大,在该列上最小。试编写相应程序。
#include<stdio.h>
/**
利用一个标记矩阵mark[][],初始化为全0;
先进行行优先遍历,找到每行最大点,依次标记mark[][]为1;
再进行一次列优先,找到每列最小点,若当前点标记mark[][]为1,则为“鞍点”,输出
*/
int main(){
int n;
int a[6][6],mark[6][6];
int i,j; // i 行 j 列
int temp;
//初始化
for(i=0;i<n;i++)
for(j=0;j<n;j++)
mark[i][j] = 0;
//输入
printf("input n: ");
scanf("%d",&n);
printf("input matrix:\n");
for(i=0;i<n;i++){
for(j=0;j<n;j++){
scanf("%d",&a[i][j]);
}
}
//找最大
for(i=0;i<n;i++){
temp = a[i][0];
for(j=1;j<n;j++){ //找到最大值是多少
if(temp<a[i][j])
temp = a[i][j];
}
for(j=0;j<n;j++){ //找到最大值所在的位置 标记
if(temp == a[i][j])
mark[i][j] = 1;
}
}
//找最小
for(j=0;j<n;j++){
temp = a[0][j];
for(i=1;i<n;i++){
if(temp>a[i][j])
temp = a[i][j];
}
for(i=0;i<n;i++)
if((temp == a[i][j])&&mark[i][j]==1){
printf("value = %d\n",a[i][j]);
printf("(%d,%d)\n",i,j);
}
}
return 0;
}
关键在于:最大最小值的寻找,多个for的嵌套使用,以及flag的灵活使用。思路是先针对某一行,进行查找最大值;最大值的下标确定后,针对这一列,判断这个最大值,在当前列下是否是最小值。关于flag,先首先假设存在答案,令flag=1。如果找到一个答案,则不改变flag,break出for循环。如果所有答案都找不到,则flag=0。
#include<stdio.h>
int main()
{
int n,flag,y;
int a[7][7];
scanf("%d",&n);
for(int i=0;i<n;i++)
for(int j=0;j<n;j++)
scanf("%d",&a[i][j]);
for(int i=0;i<n;i++)
{
y=0;
flag=1;
for(int j=0;j<n;j++)//找一行中的最大值
{
if(a[i][j]>a[i][y])
y=j;
}
for(int j=0;j<n;j++)
{
if(a[j][y]<a[i][y])
{
flag=0;
break;
}
}
if(flag){
printf("靶点:(%d,%d)(第%d行,第%d列)\n",i,y,i+1,y+1);
break;
}
}
if(!flag)
printf("no\n");
}
#include <stdio.h> int main(void) { int flag,i,j,k,row,col,n,a[6][6]; printf("Input n: "); scanf("%d",&n); printf("Input array:\n "); for(i=0; i<n; i++) for(j=0; j<n; j++) scanf("%d",&a[i][j]); for(i=0;i<n;i++){ flag=1; col=0; for(j=0;j<n;j++) if (a[i][col]<a[i][j]) col=j; for (k=0; k<n; k++) if(a[i][col]>a[k][col] ){ flag=0; break; } if(flag){ row=i; break; } } if(flag) printf("a[%d][%d]=%d\n", row, col,a[row][col]); else printf("NO\n"); return 0; }