用C語言找到所有的鞍點~

GJ504b發表於2024-12-08

一起找到所有的鞍點

題目

輸入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;
}

相關文章