user-0 提问: 大神们，帮看一下这题，运行结果没错，上传Oj显示答案错误

回复:
user: user-1
content: 引用 5 楼 qq_39369157 的回复:[quote=引用 4 楼 cfjtaishan 的回复:] 代码不易阅读，可读性比较差。变量不在多，而在根据需要而定义。 逻辑写在一起也不宜理解。  #include <stdio.h> #include <stdlib.h> #include <time.h>  #define ROW 4 #define COL 5   void init_array(int (*array)[COL], int row, int col) {     int i, j;      srand(time(NULL));     for (i = 0; i < row; i++)         for (j = 0; j < col; j++)             array[i][j] = rand() % 100; }   void show_array(int (*array)[COL], int row, int col) {     int i, j;      for (i = 0; i < row; i++) {         for (j = 0; j < col; j++)             printf("%2d ", array[i][j]);         putchar(10);     } }  void check_saddle_point(int (*point)[2], int (*array)[COL], int row, int col) {     int i, j, k, cnt = 0;     int row_idx, col_idx;     int max_row, min_col;      for (i = 0; i < row; i++) {         max_row = array[i][0];         col_idx = 0;         /* find max value in row */         for (j = 1; j < COL; j++)             if (max_row < array[i][j]) {                 max_row = array[i][j];                 col_idx = j;             }          /* Find min value in col */         min_col = array[i][col_idx];         row_idx = i;         for (k = 0; k < row; k++)             if (min_col > array[k][col_idx]) {                 min_col = array[k][col_idx];                 row_idx = k;             }         /* Check the condition*/         if (row_idx == i && min_col == max_row) {             point[cnt][0] = row_idx;             point[cnt][1] = col_idx;             cnt++;         }      } }  void init_point_array(int (*point)[2], int row) {     int i, j;      for (i = 0; i < row; i++)         for (j = 0; j < 2; j++)             point[i][j] = -1; }  void show_saddle_point(int (*point)[2], int (*array)[COL], int row) {     int i, row_idx, col_idx;      for (i = 0; i < row; i++) {         row_idx = point[i][0];         col_idx = point[i][1];         if (row_idx >= 0 && col_idx >= 0)             printf("鞍点为array[%d][%d] = %d\n", row_idx, col_idx, array[row_idx][col_idx]);     } }  int main(void) {     int array[ROW][COL];     int point[ROW][2];      init_array(array, ROW, COL);     init_point_array(point, ROW);     show_array(array, ROW, COL);     check_saddle_point(point, array, ROW, COL);     show_saddle_point(point, array, ROW);      return 0; } 这个程序是随机产生一个二维数组，建议将随机数改成你需要输入形式。 这是一个求鞍点的方法～ 引用 2 楼 fight_in_dl 的回复:错误比较隐蔽，不过总算找出来了。  假设输入为： 3 2 1 4 5 6 7 8 9  这种情况下会出错，详细原因在注释中。  int main() { 	int n, i, j, k, m, s, x, y, o; 	while (scanf("%d%d", &n, &o) != EOF) 	{ 		m = 0; 		for (x = 0; x < n; x++) 			for (j = 0; j < o; j++) 				scanf("%d", &a[x][j]); 		s = a[0][0]; y = 0; k = 0; //使用的局部变量y需要初始化。y=0;是我新加的。 		for (x = 0; x < n; x++) 		{ 			s = a[x][0]; 			for (j = 1; j<o; j++) 			{ 				if (a[x][j]>s) //对我给出的这个输入样例，第一行后两列值2，1小于3，这个if分支判断条件是假，不会执行。 				{ 					s = a[x][j]; 					k = j; y = x; //错误就在这，因为if分支不会执行，y得不到值。 				} 			} 			for (i = 0, j = k; i < n; i++) 				if (s < a[i][j]) 					m++; 			if (m == n - 1) 				break; 			k = 0; m = 0; 		} 		if (m == n - 1) 			printf("%d %d\n", y, k); //这里会报错----使用了未经初始化的局部变量。 		if (m != n - 1) 			printf("-1\n"); 	} 	return 0; } 如果有帮助，请采纳答案好吗，谢谢！ 不过我上传OJ后还是错的[/quote] 我给你的代码是随机产生的数据，你的要求是输入的数据，数据源不一样呢。你改一改吧。不能拿来别人的就用，要看看代码的逻辑嘛，不合自己的需求，那么就改改，总不能自己什么也不做的。

user: user-2
content: 偶遇到类似问题都是用 “每次用/*...*/注释掉不同部分再重新编译，直到定位到具体语法出错的位置。” 的方法解决的。

user: user-0
content: 引用 6 楼 u011280788 的回复:OJ报错的时候应该会吧 错误的case ，提示出来的吧？ 我将  引用 6 楼 u011280788 的回复:OJ报错的时候应该会吧 错误的case ，提示出来的吧？我将这里“a[x][j]>s“改成“a[x][j]>=s”，"a[x][j]<s"改成”a[x][j]<=s“ 提交后是Compilation Error Main.cc: In function ‘int main()’: Main.cc:18: error: expected primary-expression before ‘>’ token 看不懂

user: user-0
content: 引用 7 楼 zhao4zhong1 的回复:边界条件 输入输出格式 ……怎么讲？

user: user-2
content: 边界条件 输入输出格式 ……

user: user-3
content: OJ报错的时候应该会吧 错误的case ，提示出来的吧？

user: user-0
content: 引用 4 楼 cfjtaishan 的回复:代码不易阅读，可读性比较差。变量不在多，而在根据需要而定义。 逻辑写在一起也不宜理解。  #include <stdio.h> #include <stdlib.h> #include <time.h>  #define ROW 4 #define COL 5   void init_array(int (*array)[COL], int row, int col) {     int i, j;      srand(time(NULL));     for (i = 0; i < row; i++)         for (j = 0; j < col; j++)             array[i][j] = rand() % 100; }   void show_array(int (*array)[COL], int row, int col) {     int i, j;      for (i = 0; i < row; i++) {         for (j = 0; j < col; j++)             printf("%2d ", array[i][j]);         putchar(10);     } }  void check_saddle_point(int (*point)[2], int (*array)[COL], int row, int col) {     int i, j, k, cnt = 0;     int row_idx, col_idx;     int max_row, min_col;      for (i = 0; i < row; i++) {         max_row = array[i][0];         col_idx = 0;         /* find max value in row */         for (j = 1; j < COL; j++)             if (max_row < array[i][j]) {                 max_row = array[i][j];                 col_idx = j;             }          /* Find min value in col */         min_col = array[i][col_idx];         row_idx = i;         for (k = 0; k < row; k++)             if (min_col > array[k][col_idx]) {                 min_col = array[k][col_idx];                 row_idx = k;             }         /* Check the condition*/         if (row_idx == i && min_col == max_row) {             point[cnt][0] = row_idx;             point[cnt][1] = col_idx;             cnt++;         }      } }  void init_point_array(int (*point)[2], int row) {     int i, j;      for (i = 0; i < row; i++)         for (j = 0; j < 2; j++)             point[i][j] = -1; }  void show_saddle_point(int (*point)[2], int (*array)[COL], int row) {     int i, row_idx, col_idx;      for (i = 0; i < row; i++) {         row_idx = point[i][0];         col_idx = point[i][1];         if (row_idx >= 0 && col_idx >= 0)             printf("鞍点为array[%d][%d] = %d\n", row_idx, col_idx, array[row_idx][col_idx]);     } }  int main(void) {     int array[ROW][COL];     int point[ROW][2];      init_array(array, ROW, COL);     init_point_array(point, ROW);     show_array(array, ROW, COL);     check_saddle_point(point, array, ROW, COL);     show_saddle_point(point, array, ROW);      return 0; } 这个程序是随机产生一个二维数组，建议将随机数改成你需要输入形式。 这是一个求鞍点的方法～ 引用 2 楼 fight_in_dl 的回复:错误比较隐蔽，不过总算找出来了。  假设输入为： 3 2 1 4 5 6 7 8 9  这种情况下会出错，详细原因在注释中。  int main() { 	int n, i, j, k, m, s, x, y, o; 	while (scanf("%d%d", &n, &o) != EOF) 	{ 		m = 0; 		for (x = 0; x < n; x++) 			for (j = 0; j < o; j++) 				scanf("%d", &a[x][j]); 		s = a[0][0]; y = 0; k = 0; //使用的局部变量y需要初始化。y=0;是我新加的。 		for (x = 0; x < n; x++) 		{ 			s = a[x][0]; 			for (j = 1; j<o; j++) 			{ 				if (a[x][j]>s) //对我给出的这个输入样例，第一行后两列值2，1小于3，这个if分支判断条件是假，不会执行。 				{ 					s = a[x][j]; 					k = j; y = x; //错误就在这，因为if分支不会执行，y得不到值。 				} 			} 			for (i = 0, j = k; i < n; i++) 				if (s < a[i][j]) 					m++; 			if (m == n - 1) 				break; 			k = 0; m = 0; 		} 		if (m == n - 1) 			printf("%d %d\n", y, k); //这里会报错----使用了未经初始化的局部变量。 		if (m != n - 1) 			printf("-1\n"); 	} 	return 0; } 如果有帮助，请采纳答案好吗，谢谢！ 不过我上传OJ后还是错的

user: user-1
content: 引用 12 楼 qq_39369157 的回复:[quote=引用 11 楼 cfjtaishan 的回复:] [quote=引用 5 楼 qq_39369157 的回复:] [quote=引用 4 楼 cfjtaishan 的回复:] 代码不易阅读，可读性比较差。变量不在多，而在根据需要而定义。 逻辑写在一起也不宜理解。  #include <stdio.h> #include <stdlib.h> #include <time.h>  #define ROW 4 #define COL 5   void init_array(int (*array)[COL], int row, int col) {     int i, j;      srand(time(NULL));     for (i = 0; i < row; i++)         for (j = 0; j < col; j++)             array[i][j] = rand() % 100; }   void show_array(int (*array)[COL], int row, int col) {     int i, j;      for (i = 0; i < row; i++) {         for (j = 0; j < col; j++)             printf("%2d ", array[i][j]);         putchar(10);     } }  void check_saddle_point(int (*point)[2], int (*array)[COL], int row, int col) {     int i, j, k, cnt = 0;     int row_idx, col_idx;     int max_row, min_col;      for (i = 0; i < row; i++) {         max_row = array[i][0];         col_idx = 0;         /* find max value in row */         for (j = 1; j < COL; j++)             if (max_row < array[i][j]) {                 max_row = array[i][j];                 col_idx = j;             }          /* Find min value in col */         min_col = array[i][col_idx];         row_idx = i;         for (k = 0; k < row; k++)             if (min_col > array[k][col_idx]) {                 min_col = array[k][col_idx];                 row_idx = k;             }         /* Check the condition*/         if (row_idx == i && min_col == max_row) {             point[cnt][0] = row_idx;             point[cnt][1] = col_idx;             cnt++;         }      } }  void init_point_array(int (*point)[2], int row) {     int i, j;      for (i = 0; i < row; i++)         for (j = 0; j < 2; j++)             point[i][j] = -1; }  void show_saddle_point(int (*point)[2], int (*array)[COL], int row) {     int i, row_idx, col_idx;      for (i = 0; i < row; i++) {         row_idx = point[i][0];         col_idx = point[i][1];         if (row_idx >= 0 && col_idx >= 0)             printf("鞍点为array[%d][%d] = %d\n", row_idx, col_idx, array[row_idx][col_idx]);     } }  int main(void) {     int array[ROW][COL];     int point[ROW][2];      init_array(array, ROW, COL);     init_point_array(point, ROW);     show_array(array, ROW, COL);     check_saddle_point(point, array, ROW, COL);     show_saddle_point(point, array, ROW);      return 0; } 这个程序是随机产生一个二维数组，建议将随机数改成你需要输入形式。 这是一个求鞍点的方法～ 引用 2 楼 fight_in_dl 的回复:错误比较隐蔽，不过总算找出来了。  假设输入为： 3 2 1 4 5 6 7 8 9  这种情况下会出错，详细原因在注释中。  int main() { 	int n, i, j, k, m, s, x, y, o; 	while (scanf("%d%d", &n, &o) != EOF) 	{ 		m = 0; 		for (x = 0; x < n; x++) 			for (j = 0; j < o; j++) 				scanf("%d", &a[x][j]); 		s = a[0][0]; y = 0; k = 0; //使用的局部变量y需要初始化。y=0;是我新加的。 		for (x = 0; x < n; x++) 		{ 			s = a[x][0]; 			for (j = 1; j<o; j++) 			{ 				if (a[x][j]>s) //对我给出的这个输入样例，第一行后两列值2，1小于3，这个if分支判断条件是假，不会执行。 				{ 					s = a[x][j]; 					k = j; y = x; //错误就在这，因为if分支不会执行，y得不到值。 				} 			} 			for (i = 0, j = k; i < n; i++) 				if (s < a[i][j]) 					m++; 			if (m == n - 1) 				break; 			k = 0; m = 0; 		} 		if (m == n - 1) 			printf("%d %d\n", y, k); //这里会报错----使用了未经初始化的局部变量。 		if (m != n - 1) 			printf("-1\n"); 	} 	return 0; } 如果有帮助，请采纳答案好吗，谢谢！ 不过我上传OJ后还是错的[/quote] 我给你的代码是随机产生的数据，你的要求是输入的数据，数据源不一样呢。你改一改吧。不能拿来别人的就用，要看看代码的逻辑嘛，不合自己的需求，那么就改改，总不能自己什么也不做的。[/quote] 你可能理解错了，我是说2层层主告诉我的改的方法，我自己改后上传到OJ还是错的，你给我的代码我好多看不懂，没用它，还有它跟题目要求不一样，我不可能直接拿它去上传[/quote] 我上面已经说了，确实不一样，所以让你改一改。

user: user-0
content: 引用 10 楼 zhao4zhong1 的回复:偶遇到类似问题都是用 “每次用/*...*/注释掉不同部分再重新编译，直到定位到具体语法出错的位置。” 的方法解决的。 平时都有类似这样做，只不过这次错误好难找

user: user-0
content: 引用 11 楼 cfjtaishan 的回复:[quote=引用 5 楼 qq_39369157 的回复:] [quote=引用 4 楼 cfjtaishan 的回复:] 代码不易阅读，可读性比较差。变量不在多，而在根据需要而定义。 逻辑写在一起也不宜理解。  #include <stdio.h> #include <stdlib.h> #include <time.h>  #define ROW 4 #define COL 5   void init_array(int (*array)[COL], int row, int col) {     int i, j;      srand(time(NULL));     for (i = 0; i < row; i++)         for (j = 0; j < col; j++)             array[i][j] = rand() % 100; }   void show_array(int (*array)[COL], int row, int col) {     int i, j;      for (i = 0; i < row; i++) {         for (j = 0; j < col; j++)             printf("%2d ", array[i][j]);         putchar(10);     } }  void check_saddle_point(int (*point)[2], int (*array)[COL], int row, int col) {     int i, j, k, cnt = 0;     int row_idx, col_idx;     int max_row, min_col;      for (i = 0; i < row; i++) {         max_row = array[i][0];         col_idx = 0;         /* find max value in row */         for (j = 1; j < COL; j++)             if (max_row < array[i][j]) {                 max_row = array[i][j];                 col_idx = j;             }          /* Find min value in col */         min_col = array[i][col_idx];         row_idx = i;         for (k = 0; k < row; k++)             if (min_col > array[k][col_idx]) {                 min_col = array[k][col_idx];                 row_idx = k;             }         /* Check the condition*/         if (row_idx == i && min_col == max_row) {             point[cnt][0] = row_idx;             point[cnt][1] = col_idx;             cnt++;         }      } }  void init_point_array(int (*point)[2], int row) {     int i, j;      for (i = 0; i < row; i++)         for (j = 0; j < 2; j++)             point[i][j] = -1; }  void show_saddle_point(int (*point)[2], int (*array)[COL], int row) {     int i, row_idx, col_idx;      for (i = 0; i < row; i++) {         row_idx = point[i][0];         col_idx = point[i][1];         if (row_idx >= 0 && col_idx >= 0)             printf("鞍点为array[%d][%d] = %d\n", row_idx, col_idx, array[row_idx][col_idx]);     } }  int main(void) {     int array[ROW][COL];     int point[ROW][2];      init_array(array, ROW, COL);     init_point_array(point, ROW);     show_array(array, ROW, COL);     check_saddle_point(point, array, ROW, COL);     show_saddle_point(point, array, ROW);      return 0; } 这个程序是随机产生一个二维数组，建议将随机数改成你需要输入形式。 这是一个求鞍点的方法～ 引用 2 楼 fight_in_dl 的回复:错误比较隐蔽，不过总算找出来了。  假设输入为： 3 2 1 4 5 6 7 8 9  这种情况下会出错，详细原因在注释中。  int main() { 	int n, i, j, k, m, s, x, y, o; 	while (scanf("%d%d", &n, &o) != EOF) 	{ 		m = 0; 		for (x = 0; x < n; x++) 			for (j = 0; j < o; j++) 				scanf("%d", &a[x][j]); 		s = a[0][0]; y = 0; k = 0; //使用的局部变量y需要初始化。y=0;是我新加的。 		for (x = 0; x < n; x++) 		{ 			s = a[x][0]; 			for (j = 1; j<o; j++) 			{ 				if (a[x][j]>s) //对我给出的这个输入样例，第一行后两列值2，1小于3，这个if分支判断条件是假，不会执行。 				{ 					s = a[x][j]; 					k = j; y = x; //错误就在这，因为if分支不会执行，y得不到值。 				} 			} 			for (i = 0, j = k; i < n; i++) 				if (s < a[i][j]) 					m++; 			if (m == n - 1) 				break; 			k = 0; m = 0; 		} 		if (m == n - 1) 			printf("%d %d\n", y, k); //这里会报错----使用了未经初始化的局部变量。 		if (m != n - 1) 			printf("-1\n"); 	} 	return 0; } 如果有帮助，请采纳答案好吗，谢谢！ 不过我上传OJ后还是错的[/quote] 我给你的代码是随机产生的数据，你的要求是输入的数据，数据源不一样呢。你改一改吧。不能拿来别人的就用，要看看代码的逻辑嘛，不合自己的需求，那么就改改，总不能自己什么也不做的。[/quote] 你可能理解错了，我是说2层层主告诉我的改的方法，我自己改后上传到OJ还是错的，你给我的代码我好多看不懂，没用它，还有它跟题目要求不一样，我不可能直接拿它去上传

user: user-1
content: 代码不易阅读，可读性比较差。变量不在多，而在根据需要而定义。 逻辑写在一起也不宜理解。  #include <stdio.h> #include <stdlib.h> #include <time.h>  #define ROW 4 #define COL 5   void init_array(int (*array)[COL], int row, int col) {     int i, j;      srand(time(NULL));     for (i = 0; i < row; i++)         for (j = 0; j < col; j++)             array[i][j] = rand() % 100; }   void show_array(int (*array)[COL], int row, int col) {     int i, j;      for (i = 0; i < row; i++) {         for (j = 0; j < col; j++)             printf("%2d ", array[i][j]);         putchar(10);     } }  void check_saddle_point(int (*point)[2], int (*array)[COL], int row, int col) {     int i, j, k, cnt = 0;     int row_idx, col_idx;     int max_row, min_col;      for (i = 0; i < row; i++) {         max_row = array[i][0];         col_idx = 0;         /* find max value in row */         for (j = 1; j < COL; j++)             if (max_row < array[i][j]) {                 max_row = array[i][j];                 col_idx = j;             }          /* Find min value in col */         min_col = array[i][col_idx];         row_idx = i;         for (k = 0; k < row; k++)             if (min_col > array[k][col_idx]) {                 min_col = array[k][col_idx];                 row_idx = k;             }         /* Check the condition*/         if (row_idx == i && min_col == max_row) {             point[cnt][0] = row_idx;             point[cnt][1] = col_idx;             cnt++;         }      } }  void init_point_array(int (*point)[2], int row) {     int i, j;      for (i = 0; i < row; i++)         for (j = 0; j < 2; j++)             point[i][j] = -1; }  void show_saddle_point(int (*point)[2], int (*array)[COL], int row) {     int i, row_idx, col_idx;      for (i = 0; i < row; i++) {         row_idx = point[i][0];         col_idx = point[i][1];         if (row_idx >= 0 && col_idx >= 0)             printf("鞍点为array[%d][%d] = %d\n", row_idx, col_idx, array[row_idx][col_idx]);     } }  int main(void) {     int array[ROW][COL];     int point[ROW][2];      init_array(array, ROW, COL);     init_point_array(point, ROW);     show_array(array, ROW, COL);     check_saddle_point(point, array, ROW, COL);     show_saddle_point(point, array, ROW);      return 0; } 这个程序是随机产生一个二维数组，建议将随机数改成你需要输入形式。 这是一个求鞍点的方法～

user: user-4
content: 补充一下，如果测试用例中，有两个或多个整数是相等的。 题目中因为是用 > 或者 <号作为判断条件，也会出问题。  不过是否OJ会报错，您可以试试，但之前的答案中未初始化局部变量不能使用这个问题无论如何是要解决的。

user: user-4
content: 错误比较隐蔽，不过总算找出来了。  假设输入为： 3 2 1 4 5 6 7 8 9  这种情况下会出错，详细原因在注释中。  int main() { 	int n, i, j, k, m, s, x, y, o; 	while (scanf("%d%d", &n, &o) != EOF) 	{ 		m = 0; 		for (x = 0; x < n; x++) 			for (j = 0; j < o; j++) 				scanf("%d", &a[x][j]); 		s = a[0][0]; y = 0; k = 0; //使用的局部变量y需要初始化。y=0;是我新加的。 		for (x = 0; x < n; x++) 		{ 			s = a[x][0]; 			for (j = 1; j<o; j++) 			{ 				if (a[x][j]>s) //对我给出的这个输入样例，第一行后两列值2，1小于3，这个if分支判断条件是假，不会执行。 				{ 					s = a[x][j]; 					k = j; y = x; //错误就在这，因为if分支不会执行，y得不到值。 				} 			} 			for (i = 0, j = k; i < n; i++) 				if (s < a[i][j]) 					m++; 			if (m == n - 1) 				break; 			k = 0; m = 0; 		} 		if (m == n - 1) 			printf("%d %d\n", y, k); //这里会报错----使用了未经初始化的局部变量。 		if (m != n - 1) 			printf("-1\n"); 	} 	return 0; } 如果有帮助，请采纳答案好吗，谢谢！

user: user-5
content: 看了半天，楼主的程序不能保证行中最大的值是唯一的。就是说楼主求出来的“鞍点”保证了行中不唯一最大，列中唯一最大。