swustOJ 1378 Best Grass
2016-04-05 16:30
141 查看
给你一个矩形空地的长度和宽度,输入#或者. #代表草地,求出单独的没有连接的草地个数,长度宽度小于100;
示例:
5 6
.#....
..#...
..#..#
...##.
.#....
5
分析:很明显,要把全图的所有地方都搜索完,如果搜索到#,这记录的T++;然后以这个点为根节点,进行上下左右的四个方向的DFS,搜索有没有连通的草地块,如果有则继续DFS,注意,在搜索过程中,需要一个标记地图,因为如果搜索到#,与#连通,则第二个#就不能再座位单独的草地块,就需要标记,每搜索到一个#就标记下来,注意边界问题。
示例:
5 6
.#....
..#...
..#..#
...##.
.#....
5
分析:很明显,要把全图的所有地方都搜索完,如果搜索到#,这记录的T++;然后以这个点为根节点,进行上下左右的四个方向的DFS,搜索有没有连通的草地块,如果有则继续DFS,注意,在搜索过程中,需要一个标记地图,因为如果搜索到#,与#连通,则第二个#就不能再座位单独的草地块,就需要标记,每搜索到一个#就标记下来,注意边界问题。
#include<stdio.h> #include<string.h> char map[105][105]; int use[105][105],r,c; //标记 int v[4][2]={-1,0,1,0,0,1,0,-1}; //四个方向 void DFS(int i,int j) { int k; for(k=0;k<4;k++) { int x=i+v[k][0]; int y=j+v[k][1]; if(!use[x][y]&&map[x][y]=='#'&&x>=0&&x<r&&y>=0&&y<c) { use[x][y]=1; DFS(x,y); } } } int main() { int i,j,t=0,i2; scanf("%d%d",&r,&c); for(i2=0;i2<r;i2++) { scanf("%s",map[i2]); } memset(use,0,sizeof(use)); for(i=0;i<r;i++) { for(j=0;j<c;j++) { if(map[i][j]=='#'&&!use[i][j]) { use[i][j]=0; DFS(i,j); t++; } } } printf("%d\n",t); }
相关文章推荐
- 启动数据库报错ORA-01078,LRM-00109
- JCR集成Java内容仓库和Spring
- 目录遍历漏洞
- 数字版权保护(Digital Right Management,DRM)
- php实现用三元运算符求三个数中的最大值,最小值
- 单链表的逆向打印、删除无头的非尾节点、无头链表插入节点、约瑟环
- Java泛型(1)
- CentOS6.5编译安装Nginx和Openssl
- swustOJ 1209 Catch That Cow
- 启动数据库报错ORA-00845
- java-多线程-join函数
- CodeForces 366A:Dima and Guards【水】
- 主从数据库配置
- linux下C与C++混合编程
- 二分图判定
- JAVA 封神之路
- 迷宫问题
- java 读取文件路径空格和中文的处理
- Delphi CreateProcess
- Thinkphp验证码异步验证第二次及以后验证,验证错误----待解决