用C语言找到所有的鞍点~

一起找到所有的鞍点

题目

输入n阶方阵,1<n<10,找出所有鞍点即对应下标,没有就输出None!
测试用例:
in:
3
1 2 3 4 5 6 7 8 9
out:
3 02

in:
3
6 5 6 7 6 7 8 6 7
out:
6 00
6 02

in:
3
4 5 7 3 8 5 6 9 4
out: None!

in:
2
1 1 1 1
out:
1 00
1 01
1 10
1 11

/*鞍点*/
							
#include<stdio.h>
int main (){
	int a[10][10], n, i, j, flag = 0,  anDian[10], count = 0, r, c, arrC[10], arrR[10];
	scanf("%d",&n);
	for(i = 0; i < n; i++){
	    for(j = 0; j < n; j++){
	        scanf("%d", &a[i][j]);
	    }
	}//输入方阵
	
	for(i = 0; i < n; i++){
		//外循环遍历每一行---以下是对每行最大值的小点检查是否列最小
		int max = a[i][0];
		//假设max是每行第一个数字
		for(j = 1; j < n; j++){
			//遍历每一行的各个列,看假设true?
			if(max < a[i][j]){
				max = a[i][j];
			}

		}//找到了max
		for(j = 0; j < n; j++){
			flag = 0;
			if(a[i][j] == max){
				r = i;
				c = j;
				//记录到每行等于最大值元素的下标
				
				//检验列,是不是最小的
				for(int m = 0; m < n; m++){
					if(max > a[m][c]){
						flag = 1;//这一列存在比max还要小的数字,这一列的其中一个max点没有鞍点
						break;
					}		
				}
				if(flag == 0){
					anDian[count] = max;//记录鞍点
					arrR[count]  = r;//记录横坐标
					arrC[count]  = c;//记录列坐标
					count ++;
				}
			}
		}	
	}
	if(count == 0){
		printf("None!");
	}else{
		for(int i=0;i<count;i++){
			printf("%d %d%d\n",anDian[i],arrR[i],arrC[i]);
		}
	}

	return 0;
}


换成矩阵更好理解一点嘻嘻嘻


#include<stdio.h>
int main (){
	int a[10][10], n, i, j, flag = 0,  anDian[10], count = 0, r, c, arrC[10], arrR[10], x;
	scanf("%d%d",&n,&x);
	for(i = 0; i < n; i++){
	    for(j = 0; j < x; j++){
	        scanf("%d", &a[i][j]);
	    }
	}//输入方阵
	
	for(i = 0; i < n; i++){
		//外循环遍历每一行---以下是对每行最大值的小点检查是否列最小
		int max = a[i][0];
		//假设max是每行第一个数字
		for(j = 1; j < n; j++){
			//遍历每一行的各个列,看假设true?
			if(max < a[i][j]){
				max = a[i][j];
			}

		}//找到了max
		for(j = 0; j < x; j++){
			flag = 0;
			if(a[i][j] == max){
				r = i;
				c = j;
				//记录到每行等于最大值元素的下标
				
				//检验列,是不是最小的
				for(int m = 0; m < x; m++){
					if(max > a[m][c]){
						flag = 1;//这一列存在比max还要小的数字,这一列的其中一个max点没有鞍点
						break;
					}		
				}
				if(flag == 0){
					anDian[count] = max;//记录鞍点
					arrR[count]  = r;//记录横坐标
					arrC[count]  = c;//记录列坐标
					count ++;
				}
			}
		}	
	}
	if(count == 0){
		printf("None!");
	}else{
		for(int i=0;i<count;i++){
			printf("%d %d%d\n",anDian[i],arrR[i],arrC[i]);
		}
	}

	return 0;
}

posted @ 2024-12-08 14:04  GJ504b  阅读(8)  评论(0编辑  收藏  举报