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.
Write a program to count the number of black tiles which he can reach by repeating the moves described above.
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)
6 9 ....#. .....# ...... ...... ...... ...... ...... #@...# .#..#. 11 9 .#......... .#.#######. .#.#.....#. .#.#.###.#. .#.#..@#.#. .#.#####.#. .#.......#. .#########. ........... 11 6 ..#..#..#.. ..#..#..#.. ..#..#..### ..#..#..#@. ..#..#..#.. ..#..#..#.. 7 7 ..#.#.. ..#.#.. ###.### ...@... ###.### ..#.#.. ..#.#.. 0 0
45 59 6 13题意: .为黑砖,#为红砖(围墙),@为一个人的初始位置,求此人在迷宫中能走的所有黑砖个数(不可越过围墙)
思路:运用DFS走一遍,并且计数。
#include <bits/stdc++.h>
using namespace std;
char a[30][30]; //绘制地图
int W,H,sum;
int dir[4][2]= {0,1,0,-1,1,0,-1,0}; //上下左右四个方位
bool checkedge (int h,int w) //条件之一,检查是否越界
{
if(h>=1&&h<=H&&w>=1&&w<=W)
return 1;
else return 0;
}
void dfs(int h,int w)
{
sum++; //每到一个位置则步数加一,初始进入函数即初始步数也算为了加1
a[h][w]='#'; //走过的位置不再重复,位置换为墙
for(int i=0; i<4; i++) //上下左右四个方位检查能否生成节点
{
if(checkedge(h+dir[i][0],w+dir[i][1])&&a[h+dir[i][0]][w+dir[i][1]]=='.') //检查生成的下一个节点是否满足条件
dfs(h+dir[i][0],w+dir[i][1]); //满足则进入下一步(下一深度)
}
return ;
}
int main()
{
int xx,yy;
char ch;
while(~scanf("%d%d",&W,&H)&&W!=0&&H!=0)
{
sum=0;
int i,j;
scanf("%c",&ch);
for( i=1; i<=H; i++)
{
for( j=1; j<=W; j++)
{
scanf("%c",&ch);
a[i][j]=ch;
if(ch=='@') //记录初始坐标
{
xx=i,yy=j;
}
}
scanf("%c",&ch);
}
dfs(xx,yy); //赋入初始坐标
printf("%d\n",sum);
}
return 0;
}
using namespace std;
char a[30][30]; //绘制地图
int W,H,sum;
int dir[4][2]= {0,1,0,-1,1,0,-1,0}; //上下左右四个方位
bool checkedge (int h,int w) //条件之一,检查是否越界
{
if(h>=1&&h<=H&&w>=1&&w<=W)
return 1;
else return 0;
}
void dfs(int h,int w)
{
sum++; //每到一个位置则步数加一,初始进入函数即初始步数也算为了加1
a[h][w]='#'; //走过的位置不再重复,位置换为墙
for(int i=0; i<4; i++) //上下左右四个方位检查能否生成节点
{
if(checkedge(h+dir[i][0],w+dir[i][1])&&a[h+dir[i][0]][w+dir[i][1]]=='.') //检查生成的下一个节点是否满足条件
dfs(h+dir[i][0],w+dir[i][1]); //满足则进入下一步(下一深度)
}
return ;
}
int main()
{
int xx,yy;
char ch;
while(~scanf("%d%d",&W,&H)&&W!=0&&H!=0)
{
sum=0;
int i,j;
scanf("%c",&ch);
for( i=1; i<=H; i++)
{
for( j=1; j<=W; j++)
{
scanf("%c",&ch);
a[i][j]=ch;
if(ch=='@') //记录初始坐标
{
xx=i,yy=j;
}
}
scanf("%c",&ch);
}
dfs(xx,yy); //赋入初始坐标
printf("%d\n",sum);
}
return 0;
}