這題挺簡單的,但,每日一篇。說兩點:第一,我的粗心導致我這題花了大把的時間去找錯誤,看到4個測試用例對了三個,我以為是那塊的邊界條件沒考慮到,又或者是存在隱蔽的邏輯或語法錯誤,通過與別人程序的反復對比才發現是我的四個大於條件中的兩個寫一樣了,也就少了一個,悲劇;第二,flag用的有點別扭,用個cnt++其實就行,但邏輯上要表達的就是是否的關系,我還是用了bool,題設要求及代碼實現如下
1 /* 2 Name: 3 Copyright: 4 Author: 5 Date: 02/04/15 11:05 6 Description: 7 給定M行N列的整數矩陣A,如果A的非邊界元素A[i][j]大於相鄰的上下左右4個元素,那麼就稱元素A[i][j]是矩陣的局部極大值。本題要求給定矩陣的全部局部極大值及其所在的位置。 8 9 輸入格式: 10 11 輸入在第1行中給出矩陣A的行數M和列數N(3<=M,N<=20);最後M行,每行給出A在該行的N個元素的值。數字間以空格分隔。 12 13 輸出格式: 14 15 每行按照“元素值 行號 列號”的格式輸出一個局部極大值,其中行、列編號從1開始。要求按照行號遞增輸出;若同行有超過1個局部極大值,則該行按列號遞增輸出。若沒有局部極大值,則輸出“None 總行數 總列數”。 16 17 輸入樣例1: 18 4 5 19 1 1 1 1 1 20 1 3 9 3 1 21 1 5 3 5 1 22 1 1 1 1 1 23 輸出樣例1: 24 9 2 3 25 5 3 2 26 5 3 4 27 輸入樣例2: 28 3 5 29 1 1 1 1 1 30 9 3 9 9 1 31 1 5 3 5 1 32 輸出樣例2: 33 None 3 5 34 */ 35 36 #include <stdio.h> 37 #include <stdbool.h> 38 39 void maxium(int M, int N); 40 41 int main() 42 { 43 // freopen("in.txt", "r", stdin); // for test 44 45 int M, N; 46 47 scanf("%d%d", &M, &N); 48 49 maxium(M, N); 50 51 // fclose(stdin); // for test 52 53 return 0; 54 } 55 56 void maxium(int M, int N) 57 { 58 int i, j, a[M][N]; 59 60 for(i = 0; i < M; i++) 61 for(j = 0; j < N; j++) 62 scanf("%d", &a[i][j]); 63 64 bool flag; 65 66 flag = true; 67 for(i = 1; i < M - 1; i++) 68 { 69 for(j = 1; j < N - 1; j++) 70 { 71 if(a[i][j] > a[i - 1][j] && a[i][j] > a[i][j + 1] && a[i][j] > a[i + 1][j] && a[i][j] > a[i][j - 1]) 72 { 73 printf("%d %d %d\n", a[i][j], i + 1, j + 1); 74 if(flag) 75 flag = false; 76 } 77 } 78 } 79 if(flag) 80 printf("None %d %d\n", M ,N); 81 }