hdu 3316 Mine sweeping

题目的意思就是简单的扫雷游戏,每到一个点,便判断该点是否是k=0的点,若是则以这个点为中心自动触发它周围的与它相邻八个点,若在这八个点中有雷,则该点不触发;若该点不是k=0的点,则不自动触发它周围的点。(附代码)

  1 # include <cstdio>
  2 # include <cstring>
  3 # include <cstdlib>
  4 # include <iostream>
  5 # include <queue>
  6 using namespace std;
  7 
  8 struct Point{
  9     int x, y;
 10 };
 11 
 12 int n;
 13 int startx, starty;
 14 int step[8][2] = {{1, 0}, {1, 1} ,{0, 1}, {-1, 1}, {-1, 0}, {-1, -1}, {0, -1}, {1, -1}};
 15 char map[101][101];
 16 char visit[101][101];
 17 int temp[101][101];
 18 void BFS()
 19 {
 20     Point p, t;
 21     int i;
 22     queue<Point> que;
 23     p.x = startx;
 24     p.y = starty;
 25     visit[p.x][p.y] = '0' + temp[p.x][p.y];
 26     que.push(p);
 27 
 28     while(!que.empty())
 29     {
 30         p  = que.front();
 31         que.pop();
 32         if(temp[p.x][p.y] == 0)
 33         {
 34             for(i = 0; i < 8; ++i)
 35             {
 36                 t.x = step[i][0] + p.x;
 37                 t.y = step[i][1] + p.y;
 38                 if(t.x < 0 || t.x >= n || t.y < 0 || t.y >= n
 39                    || visit[t.x][t.y] != '.' || temp[t.x][t.y] == -1)
 40                    continue;
 41                 if(temp[t.x][t.y] > 0)
 42                 {
 43                     visit[t.x][t.y] = temp[t.x][t.y] + '0';
 44                     continue;
 45                 }
 46                 else if(temp[t.x][t.y] == 0)
 47                 {
 48                     visit[t.x][t.y] = temp[t.x][t.y] + '0';
 49                     que.push(t);
 50                     continue;
 51                 }
 52             }
 53         }
 54     }
 55 }
 56 int main()
 57 {
 58     freopen("in.txt", "r", stdin);
 59     while(scanf("%d", &n) != EOF)
 60     {
 61         int i, j, k;
 62         for(i = 0; i < n; ++i)
 63         {
 64             scanf("%s", map[i]);
 65         }
 66 
 67         scanf("%d %d", &startx, &starty);
 68 
 69         for(i = 0; i < n; ++i)
 70         {
 71             for(j = 0; j < n; ++j)
 72             {
 73                 temp[i][j] = 0;
 74                 visit[i][j] = '.';
 75             }
 76         }
 77 
 78         for(i = 0; i < n; ++i)
 79         {
 80             for(j = 0; j < n; ++j)
 81             {
 82                 if(map[i][j] == 'X')
 83                 {
 84                     temp[i][j] = -1;
 85                     for(k =0 ; k < 8; ++k)
 86                     {
 87                         if(i + step[k][0] < 0 || i + step[k][0] >= n ||
 88                            j + step[k][1] < 0 || j + step[k][1] >= n || temp[i + step[k][0]][j + step[k][1]] == -1)
 89                            continue;
 90                         temp[i + step[k][0]][j + step[k][1]] ++;
 91                     }
 92                 }
 93             }
 94         }
 95 //        for(i = 0; i < n; ++i)
 96 //        {
 97 //            for(j = 0; j < n; ++j)
 98 //            printf("%2d", temp[i][j]);
 99 //            printf("\n");
100 //        }
101 
102         if(map[startx][starty] == 'X')
103         printf("it is a beiju!\n");
104         else
105         {
106             BFS();
107             for(i = 0; i < n; ++i)
108             {
109                 for(j = 0; j < n; ++j)
110                 {
111                     if(visit[i][j] >= '0' && visit[i][j] <= '9')
112                     printf("%c", visit[i][j]);
113                     else
114                     printf(".");
115                 }
116                 printf("\n");
117             }
118         }
119         printf("\n");
120     }
121     return 0;
122 }
View Code

 

posted @ 2013-10-05 13:50  shihuai_2  阅读(274)  评论(0)    收藏  举报