黑白图像问题[DFS]
2014-04-24 14:53
225 查看
输入一个n*n的黑白图像(1表示黑色,0表示白色),任务是统计其中连块的个数。如果两个黑格子有公共边,就是属于一个连快。如图:
输入时,每个数据之间有一个空格。
样例输入:
1 0 0 0 0 1 0 0
0 0 0 0 1 1 1 0
0 1 1 0 0 0 0 0
0 1 1 1 0 0 0 0
0 0 0 0 0 0 1 0
1 1 0 0 0 1 1 1
1 1 1 0 0 0 1 1
0 1 0 0 0 0 1 0
样例输出:
5
用递归求解:从每个黑格子出发,递归访问它所有相邻的黑格。
这里,黑格的mat[x][y]为1,白格为0。问:这个程序是在哪里判断出界的?答案是:在输入之前,在迷宫的外面加上一圈虚拟的白格子,代码如下:
输入时,每个数据之间有一个空格。
样例输入:
1 0 0 0 0 1 0 0
0 0 0 0 1 1 1 0
0 1 1 0 0 0 0 0
0 1 1 1 0 0 0 0
0 0 0 0 0 0 1 0
1 1 0 0 0 1 1 1
1 1 1 0 0 0 1 1
0 1 0 0 0 0 1 0
样例输出:
5
用递归求解:从每个黑格子出发,递归访问它所有相邻的黑格。
这里,黑格的mat[x][y]为1,白格为0。问:这个程序是在哪里判断出界的?答案是:在输入之前,在迷宫的外面加上一圈虚拟的白格子,代码如下:
#include <iostream> #include <cstring> using namespace std; #define MAXN 50 int mat[MAXN][MAXN]; /**黑色为1, 白色为0 */ int vis[MAXN][MAXN]; /**访问为1,未访问为0 */ int s[MAXN][MAXN]; void dfs(int x,int y) { if ( mat[x][y]==0 || vis[x][y]) return; /**访问过这个格子,或者这个格子是白色*/ vis[x][y]=1; dfs(x,y-1); dfs(x-1,y); dfs(x+1,y); dfs(x,y+1); /**递归访问周围的4个格子**/ } int main() { int n; cin>>n; memset(mat,0,sizeof(mat)); /**所有格子初始化为白色,包括周围一圈的虚拟格子*/ memset(vis,0,sizeof(vis)); for (int i = 0 ; i < n ; i++) for (int j = 0 ; j < n ; j++) { cin>>s[i][j]; mat[i+1][j+1]=s[i][j]; /**把图像往中间移动一点,空出白格子*/ } int count = 0; for (int i = 1 ; i <= n ; i++ ) for (int j = 1; j <= n; j++) if (mat[i][j]==1 && vis[i][j]==0) {count++; dfs(i,j);} cout<<count<<endl; return 0; }
相关文章推荐
- Vim下的全选和替换
- Android开发中一些小记录
- Positional parameter are considered deprecated; use named parameters or JPA-style positional parame
- Andoid - 开发实例(4):简易在线聊天实现 (Client+Server)
- druid与dbutils集成示例
- 论这两年不断突破心理底线的互联网薪水by OfferCome&&从猎头角度推测,搜狗的买卖对于互联网格局和薪水的影响&&烧钱薪水反思
- LOL视角挂一枚
- iText
- 经济学数据
- C/C++字节对齐详解
- Javascript 异步加载详解
- ubuntu android installscript
- instancof 方法
- IOS崩溃错误总结
- ios开发之View属性hidden, opaque, alpha的区别
- 统一资源定位符——URL
- ASP.NET MVC 5– 使用Wijmo MVC 5模板1分钟创建应用
- thinkphp G方法的华丽升级
- MongoDB---主从集
- Qt 创建shared library,调用shared library