PAT 08-2 求矩阵的局部最大值

这题挺简单的,但,每日一篇。说两点:第一,我的粗心导致我这题花了大把的时间去找错误,看到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 }

 

posted @ 2015-04-02 21:08  自由的青  阅读(6548)  评论(2编辑  收藏  举报