fzu 1920 Left Mouse Button(dfs)
2013-12-04 23:38
387 查看
题目链接:fzu 1920 Left Mouse Button
题目大意:给出一张图,数字代表说周围8个位置有多少个地雷’@‘,然后根据扫雷的规则,点在0的位置话,会将一片连在一起的0全部显示出来,外加0的周围一圈。问说最少要多少步可以点完所有没有泪的位置。
解题思路:遍历图,碰到’0‘的时候用dfs搜索将一片整体的全标记起来。然后最后在计算没有标记且不是雷的位置的个数,加上前面调用dfs的次数就是答案了。
题目大意:给出一张图,数字代表说周围8个位置有多少个地雷’@‘,然后根据扫雷的规则,点在0的位置话,会将一片连在一起的0全部显示出来,外加0的周围一圈。问说最少要多少步可以点完所有没有泪的位置。
解题思路:遍历图,碰到’0‘的时候用dfs搜索将一片整体的全标记起来。然后最后在计算没有标记且不是雷的位置的个数,加上前面调用dfs的次数就是答案了。
#include <stdio.h> #include <string.h> 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 ; char g ; 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; }
相关文章推荐
- 取数组最小值
- Android 中状态栏、标题栏、View的大小及区分
- 初步了解Sencha,运用Sencha写一个简单的表单
- 豆沙绿 85 123 205
- scp命令获取远程文件
- error:2014 Commands out of sync; you can't run this command now
- 第九天
- [LeetCode]136.Single Numbe
- ubuntu 12.04 安装无线网卡驱动
- Struts工作原理
- 系统分区不求人 Windows7分区功能详解!
- Linux查看文件系统类型和UUID df -T & blkid
- Android实现自定义对话框
- windows上的网络基础库
- 发布Android APK应用流程
- c语言入门!
- 项目管理随想之二
- Spring文件配置模板
- c语言基础!
- HDU--杭电--2105--The Center of Gravity--数学题,求三角形重心