I - DFS(依然是漫水填充)
2015-07-21 16:38
316 查看
Description
There is a rectangular room, covered with square tiles. Each tile is colored either red or black. A man is standing on a black tile. From a tile, he can move to one of four adjacent tiles. But he can't move on red tiles, he can move only on black tiles.
Write a program to count the number of black tiles which he can reach by repeating the moves described above.
Input
The input consists of multiple data sets. A data set starts with a line containing two positive integers W and H; W and H are the numbers of tiles in the x- and y- directions, respectively. W and H are not more than 20.
There are H more lines in the data set, each of which includes W characters. Each character represents the color of a tile as follows.
'.' - a black tile
'#' - a red tile
'@' - a man on a black tile(appears exactly once in a data set)
The end of the input is indicated by a line consisting of two zeros.
Output
For each data set, your program should output a line which contains the number of tiles he can reach from the initial tile (including itself).
Sample Input
Sample Output
There is a rectangular room, covered with square tiles. Each tile is colored either red or black. A man is standing on a black tile. From a tile, he can move to one of four adjacent tiles. But he can't move on red tiles, he can move only on black tiles.
Write a program to count the number of black tiles which he can reach by repeating the moves described above.
Input
The input consists of multiple data sets. A data set starts with a line containing two positive integers W and H; W and H are the numbers of tiles in the x- and y- directions, respectively. W and H are not more than 20.
There are H more lines in the data set, each of which includes W characters. Each character represents the color of a tile as follows.
'.' - a black tile
'#' - a red tile
'@' - a man on a black tile(appears exactly once in a data set)
The end of the input is indicated by a line consisting of two zeros.
Output
For each data set, your program should output a line which contains the number of tiles he can reach from the initial tile (including itself).
Sample Input
6 9 ....#. .....# ...... ...... ...... ...... ...... #@...# .#..#. 11 9 .#......... .#.#######. .#.#.....#. .#.#.###.#. .#.#..@#.#. .#.#####.#. .#.......#. .#########. ........... 11 6 ..#..#..#.. ..#..#..#.. ..#..#..### ..#..#..#@. ..#..#..#.. ..#..#..#.. 7 7 ..#.#.. ..#.#.. ###.### ...@... ###.### ..#.#.. ..#.#.. 0 0
Sample Output
45 59 6 13 这道题依然是DFS求连通块,首先找到@,然后将它的值改成.,再对这一块进行填充就行,每填充一点,计数器就加一
#include"iostream" #include"cstring" #include"cstdio" using namespace std; char a[101][101]; int book[101][101]; int n,m; int ans; void dfs(int x,int y,int z) { if(x<0||x>=n||y<0||y>=m) return; if(book[x][y]==1||a[x][y]!='.') return; book[x][y]=z; ans++; for(int i=-1;i<=1;i++) for(int j=-1;j<=1;j++) if(j==0||i==0) dfs(x+i,y+j,z); } int main() { while(scanf("%d%d",&m,&n)==2&&n&&m) { // memset(a,0,sizeof(a)); for(int i=0;i<n;i++) scanf("%s",a[i]); memset(book,0,sizeof(book)); ans=0; for(int j=0;j<n;j++) for(int k=0;k<m;k++) { if(a[j][k]=='@') {a[j][k]='.';dfs(j,k,1);} } cout<<ans<<endl; } return 0; }
相关文章推荐
- 【公告】新博客、新地址,欢迎交换友链
- Matlab 常用绘图指令(二维图形)
- 7.设计一个抽象类Shape, 属性为x和y,表示圆心坐标,计算面积的抽象方法double area(),并设计一个计算圆心距离坐标原点距离的方法distance(double x ,double y
- 软件包管理器之二――YUM介绍及使用
- android 中共享变量SharedPreferences的使用
- C#设置WinForm中DataGrid列的方法(列宽/列标题等)
- 上传控件动态化2
- 【Ogre引擎架构】第五讲 从零开始编写3dsMax导出插件
- Java实现多种单例模式SingletonPattern
- 求多边形面积的问题
- 折线分割平面
- Difference between HashSet and HashMap in Java
- 在Qt creator中选择了dark配色方案编写shell,某些命令为深紫色很难看清楚的解决方法
- cactiEZ 添加PHP扩展模块mssql及相关设置问题整理
- 栈模板
- 针对性的mysql 查询统计
- NOIP难度 零件分组 stick 题解&代码
- BAPI_GOODSMVT_CREATE
- Pdb Commands
- Matlab保存图像的方法