hud4414-Finding crosses(简单题)

枚举中间点,向四个方向搜索十字架,注意十字架旁边不能为#

View Code
 1 //Accepted    4414    0MS    244K    1157 B    C++    
 2 #include <stdio.h>
 3 #include <string.h>
 4 int n;
 5 char map[51][51];
 6 
 7 int cmp(int x,int y)
 8 {
 9     if( x >= 0 && y >=0 && x < n && y < n && map[x][y]=='#')
10         return 1;
11     return 0;
12 }
13 
14 int solve1(int x,int y)
15 {
16     int a,b,c,d;//a上  b下  c左 d右
17     int i;
18     a = b = c = d = 0;
19     //向上
20     for(i=x-1;i>=0;i--)
21     {
22         if(cmp(i,y))
23         {
24             a++;
25             if(cmp(i,y-1) || cmp(i,y+1))
26                 return 0;
27         }
28         else break;
29     }
30     //向下
31     for(i=x+1;i<n;i++)
32     {
33         if(cmp(i,y))
34         {
35             b++;
36             if(cmp(i,y-1) || cmp(i,y+1))
37                 return 0;
38         }
39         else break;
40     }
41     //向左
42     for(i=y-1;i>=0;i--)
43     {
44         if(cmp(x,i))
45         {
46             c++;
47             if(cmp(x-1,i) || cmp(x+1,i))
48                 return 0;
49         }
50         else break;
51     }
52     //向右
53     for(i=y+1;i<n;i++)
54     {
55         if(cmp(x,i))
56         {
57             d++;
58             if(cmp(x-1,i) || cmp(x+1,i))
59                 return 0;
60         }
61         else break;
62     }
63     if(a == b && c == d && a == c && a > 0)
64         return 1;
65     return 0;
66 }
67 
68 int main(void)
69 {
70     int i,j;
71     while(scanf("%d",&n)==1 && n)
72     {
73         for(i=0;i<n;i++)
74             scanf("%s",map[i]);
75         int ans = 0;
76         for(i=1;i<n-1;i++)
77             for(j=1;j<n-1;j++)
78                 if(map[i][j]=='#' && solve1(i,j))
79                     ans++;
80         printf("%d\n",ans);
81     }
82     return 0;
83 }
posted @ 2012-09-23 19:52  Wheat″  阅读(170)  评论(0)    收藏  举报