fzu 1920 Left Mouse Button(dfs)

2014-11-24 02:59:15 · 作者: · 浏览: 1

题目链接:fzu 1920 Left Mouse Button


题目大意:给出一张图,数字代表说周围8个位置有多少个地雷’@‘,然后根据扫雷的规则,点在0的位置话,会将一片连在一起的0全部显示出来,外加0的周围一圈。问说最少要多少步可以点完所有没有泪的位置。


解题思路:遍历图,碰到’0‘的时候用dfs搜索将一片整体的全标记起来。然后最后在计算没有标记且不是雷的位置的个数,加上前面调用dfs的次数就是答案了。


#include 
  
   
#include 
   
     const int N = 10; const int d[][2] = { {0, 1}, {0, -1}, {1, 0}, {-1, 0}, {1, -1}, {1, 1}, {-1, -1}, {-1, 1} }; int n, v[N][N]; char g[N][N]; void init() { scanf("%d", &n); for (int i = 0; i < n; i++) scanf("%s", g[i]); memset(v, 0, sizeof(v)); } void dfs(int x, int y) { v[x][y] = 1; if (g[x][y] != '0') return; for (int i = 0; i < 8; i++) { int p = x + d[i][0], q = y + d[i][1]; if (p < 0 || p >= n) continue; if (q < 0 || q >= n) continue; if ( !v[p][q] ) dfs(p, q); } } int solve() { int ans = 0; for (int i = 0; i < n; i++) { for (int j = 0; j < n; j++) { if ( !v[i][j] && g[i][j] == '0') dfs(i, j), ans++; } } for (int i = 0; i < n; i++) { for (int j = 0; j < n; j++) { if ( !v[i][j] && g[i][j] != '@') ans++; } } return ans; } int main () { int cas; scanf("%d", &cas); for (int i = 1; i <= cas; i++) { init(); printf("Case %d: %d\n", i, solve() ); } return 0; }