C语言练习——鞍点
题目出自“中国大学MOOC”翁恺老师《程序设计入门——C语言》第七周编程练习第二题
以下为题目要求:
给定一个n*n矩阵A。矩阵A的鞍点是一个位置(i,j),在该位置上的元素是第i行上的最大数,第j列上的最小数。一个矩阵A也可能没有鞍点。
你的任务是找出A的鞍点。
输入格式:
输入的第1行是一个正整数n, (1<=n<=100),然后有n行,每一行有n个整数,同一行上两个整数之间有一个或多个空格。
输出格式:
对输入的矩阵,如果找到鞍点,就输出其下标。下标为两个数字,第一个数字是行号,第二个数字是列号,均从0开始计数。
如果找不到,就输出
NO
题目所给的数据保证了不会出现多个鞍点。
输入样例:
4
1 7 4 1
4 8 3 6
1 6 1 2
0 7 8 9
输出样例:
2 1
时间限制:500ms内存限制:32000kb
以下为博主给出的代码,仅供参考:
//寻找一个方形矩阵的鞍点(saddle point)
#include <stdio.h>
int main(){
//读入一个数字,决定这个方形矩阵是几阶的
int n;
scanf("%d",&n);
//定义n阶矩阵以及将要用到的变量
int matrix[n][n];
int i,j,temp,count,flag=0;
//读入矩阵中的每一个数
for(i=0; i<n; i++){
for(j=0; j<n; j++){
scanf("%d",&temp);
matrix[i][j]=temp;
}
}
//测试读入的数据是否正确
/* {
for(i=0; i<n; i++){
printf("%d\t",i);
for(j=0; j<n; j++){
printf("%d\t",matrix[i][j]);
}
printf("\n");
}
}
*/
//开始寻找鞍点
for(i=0; i<n; i++){
//找出每行中的最大的数字
temp=matrix[i][0]; //用temp与count标识出每行中最大的数字以及位置
count=0;
for(j=1; j<n; j++){
if(temp<matrix[i][j]){
temp=matrix[i][j];
count=j;
}
}
//测试一下,此行最大的数字,是否是其所在列的最小数字
for(j=0;j<n;j++){
if(matrix[j][count]<temp){
flag++; //如果有数字小temp,flag就不为零
}
}
if(flag==0){ //测试flag值,如果为零,证明此数正是要找的鞍点
printf("%d %d\n",i,count);
break;
}
flag=0;
}
//如果没找到鞍数,循环终止,输出“NO”
if(i==n){
printf("NO");
}
return 0;
}
思考:这一周学的是数组,没有以前的代码写起来那么容易了,调试了好几次才通过。而且有一点感触的是,注释很重要,如果不加注释,随便写代码,过后再看代码,不要说别人了,自己也看不懂啊。而且写注释,能让自己的思路更加清晰直观,代码出错调试起来也方便快捷。