C - 红与黑
Time Limit: 1000/1000MS (C++/Others) Memory Limit: 65536/65536KB (C++/Others)
Problem Description
有一个矩形的房间,房间铺着正方形的地砖。每个地砖被涂上红色或者黑色。初始时你站在房间里的某个黑色地砖上,你每次只能移动到相邻的四个地砖之一,即上下左右移动,并且你每次只能移动到黑色的地砖上,不能走到红色地砖。
编程计算出按照上述要求你能走到的黑色地砖的个数。Input
输入包含多组测试数据。每组测试数据第一行包括2个整数W和H;W和H是房间的宽度和长度,分别表示为房间的x和y坐标轴。W和H不大于20。接下来是H行每行W个地砖的房间,每个地砖表示如下:
‘.’——黑色地砖
‘#’——红色地砖
‘@’ ——你在房间里的初始位置(房间只出现一次)。
输入的最后一行是两个整数0,不用处理。Output
对每个测试样例,输出一行,即你能走到的黑色地砖的个数(包括你初始站在的黑色地砖)。
Sample Input
6 9 ....#. .....# ...... ...... ...... ...... ...... #@...# .#..#. 11 9 .#......... .#.#######. .#.#.....#. .#.#.###.#. .#.#..@#.#. .#.#####.#. .#.......#. .#########. ........... 11 6 ..#..#..#.. ..#..#..#.. ..#..#..### ..#..#..#@. ..#..#..#.. ..#..#..#.. 7 7 ..#.#.. ..#.#.. ###.### ...@... ###.### ..#.#.. ..#.#.. 0 0Sample Output
45 59 6 13
#include<cstdio> #include<cstring> int tox[] = {1, 0, 0, -1}; int toy[] = {0, 1, -1, 0}; char mp[25][25]; int w, h, cnt; bool judge(int x, int y){ // 坐标(x, y) 在图的范围内,并且为黑色地砖('.') if(x >= 0 && x < h && y >= 0 && y < w && mp[x][y] == '.') return true; else return false; } void dfs(int x, int y){ cnt++; //一个能走的,让cnt++ mp[x][y] = '#'; // 把走过的变为不能走的,避免重复计算 for(int i=0; i<4; i++){ // 枚举四连通的走法 if(judge(x + tox[i], y + toy[i])){ // 如果下一步在图内并且可走 dfs(x + tox[i], y + toy[i]); } } } int main() { while(scanf("%d%d", &w, &h) && w && h){ for(int i=0; i<h; i++){ // 输入图 scanf("%s", mp[i]); } cnt = 0; for(int i=0; i<h; i++){ for(int j=0; j<w; j++){ // 遍历寻找 @ 起点 if(mp[i][j] == '@') { dfs(i, j); } } } printf("%d ", cnt); } return 0; }