一起找到所有的鞍點
題目
輸入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;
}