红与黑-dfs

来源:互联网 发布:os x 怎么恢复mac系统 编辑:程序博客网 时间:2024/04/30 00:37
 问题 I: 红与黑

时间限制: 1 Sec  内存限制: 32 MB
提交: 19  解决: 15
[提交][状态][讨论版]

题目描述
小明站在一个矩形房间里,这个房间的地面铺满了地砖,每块地砖的颜色或是红色或是黑色。小明一开始站在一块黑色地砖上,并且小明从一块地砖可以向上下左右四个方向移动到其他的地砖上,但是他不能移动到红色地砖上,只能移动到黑色地砖上。
请你编程计算小明可以走到的黑色地砖最多有多少块。
输入
输入包含多组测试数据。
每组输入首先是两个正整数W和H,分别表示地砖的列行数。(1<=W,H<=20)
接下来H行,每行包含W个字符,字符含义如下:
‘.’表示黑地砖;
‘#’表示红地砖;
‘@’表示小明一开始站的位置,此位置是一块黑地砖,并且这个字符在每组输入中仅会出现一个。
当W=0,H=0时,输入结束。
输出
对于每组输入,输出小明可以走到的黑色地砖最多有多少块,包括小明最开始站的那块黑色地砖。

样例输入

6 9
....#.
.....#
......
......
......
......
......
#@...#
.#..#.
11 9
.#.........
.#.#######.
.#.#.....#.
.#.#.###.#.
.#.#..@#.#.
.#.#####.#.
.#.......#.
.#########.
...........
11 6
..#..#..#..
..#..#..#..
..#..#..###
..#..#..#@.
..#..#..#..
..#..#..#..
7 7
..#.#..
..#.#..
###.###
...@...
###.###
..#.#..
..#.#..
0 0

样例输出

45
59
6
13


解题思路:就是用深搜吧,所有能到的地方都搜一遍。

下面是代码:
#include <stdio.h>#include <string.h>char a[31][31];int next[4][2]={{0,1},{1,0},{-1,0},{0,-1}},book[31][31];int n,m,count;void dfs(int x, int y)//深搜 模板。 {int k, tx, ty;count++;for(int k=0; k <=3; k++){tx = x+next[k][0];ty = y+next[k][1];if(tx<1 || ty<1 || tx>m || ty >n)continue;if(a[tx][ty]!='#'&&book[tx][ty]==0){book[tx][ty]=1;dfs(tx,ty);}}}int main(){int i, j, x, y;while(~scanf("%d %d", &n, &m))//这道题的m代表行,n代表列 {getchar();//记得吃掉换行,呜呜 memset(book,0,sizeof(book));for(i=1; i<=m; i++){for(j=1; j<=n;j++){scanf("%c", &a[i][j]);if(a[i][j]=='@'){x=i;y=j;}}getchar();//还有这里的换行。。。 }count=0;book[x][y]=1;dfs(x,y);printf("%d\n", count);} } 



0 0
原创粉丝点击