黑白图像
2015-07-14 14:44
344 查看
输入一个n*n的黑白图像(1表示黑色,0表示白色 ),任务是统计其中八连块的个数,并输出其中最大的块数,如果两个黑格子有公共边或者公共顶点,就说他们属于同一个八连块。
#include<iostream> #include<string> #include<cstring> using namespace std; const int Max = 100; int a[Max],maxnumber = 0,fn = 0; int mat[Max][Max]; int vis[Max][Max]; void dfs(int x,int y) { if(vis[x][y] || !mat[x][y]) return ; vis[x][y] = 1; fn++; dfs(x-1,y); dfs(x+1,y); dfs(x,y-1); dfs(x,y+1); dfs(x-1,y-1); dfs(x-1,y+1); dfs(x+1,y+1); dfs(x+1,y-1); } int main() { int n; char s[Max]; while(cin>>n) { int cnt =0; maxnumber = 0; memset(mat,0,sizeof(mat)); //初始化为白的 memset(vis,0,sizeof(vis)); //初始化为未访问 for(int i = 0; i < n; i++ ) { cin>>s; for(int j = 0; j < n; j++) mat[i+1][j+1] = s[j]-'0'; //将字符串改为01数字,并且把图像网中间移动一个方格,空出一圈白格子。 } for(int i = 1; i <= n; i ++){ for(int j = 1; j <= n; j ++){ if(!vis[i][j] && mat[i][j]){ fn = 0; dfs(i,j); cnt++; if(fn>maxnumber) maxnumber = fn; //cout<<maxnumber<<endl; } } } cout<<cnt<<endl; cout<<maxnumber<<endl; } }刚开始把fn设置为dfs中的参数,却发现八连块的最大值总是错的,原来是程序执行dfs时当return时fn的值也将退回造成的。想想应该把fn定义在dfs外面,执行了几次递归调用就++几次。
相关文章推荐
- 【前端JS】radio 可单选可点击取消选中
- java 文件输出流覆盖问题
- 13.文件指针
- hdu 1533 Going Home(最小费用最大流)
- 计算之道 (淘汰赛车)
- Java基础-异常-throws Exception-抛声明
- 归并排序 Merge Sort
- 动态获取UIWebView的高度
- UNIX/linux密码文件介绍
- Easy way to use JText 2.1.7 and HTML-style template for generating report
- 动态加载script文件
- iOS开发:git命令返回任意一个版本的方法
- 快速开发工具
- The Toast in android
- 批量替换内容关键词为文件名
- Windows启动及停止服务
- C#对多个集合和数组的操作(合并,去重,判断)
- 快速排序 Quick Sort
- Java SE 8: Lambda表达式
- Android—jar包存在,编译无错,运行有错java.lang.NoClassDefFoundError:dao.master....