1405: Red and Black
Time Limit: 1 Sec Memory Limit: 128 MBSubmit: 297 Solved: 202
Submit Status Web Board
Description
有一个矩形房间,覆盖着正方形瓷砖。每块瓷砖涂成了红色或黑色。一名男子站在黑色的瓷砖上,由此出发,可以移到四个相邻瓷砖之一,但他不能移动到红砖上,只能移动到黑砖上。编写一个程序,计算他通过重复上述移动所能经过的黑砖数。
Input
输入包含多个数据集。一个数据集开头行包含两个整数
W
和
H
,
W
和
H
分别表示矩形房间的列数和行数,且都不超过
20
。
每个数据集有
H
行,其中每行包含
W
个字符。每个字符的含义如下所示:
'.' –
黑砖;
'#' –
红砖
'@' –
男子(每个数据集仅出现一次)
两个0表示输入结束。
Output
对于每个数据集,程序应该输出一行,包含男子从初始瓷砖出发可到达的瓷砖数(包括他自己所站的那一块瓷砖)。
Sample Input
6 9 ....#. .....# ...... ...... ...... ...... ...... #@...# .#..#. 11 9 .#......... .#.#######. .#.#.....#. .#.#.###.#. .#.#..@#.#. .#.#####.#. .#.......#. .#########. ........... 11 6 ..#..#..#.. ..#..#..#.. ..#..#..### ..#..#..#@. ..#..#..#.. ..#..#..#.. 7 7 ..#.#.. ..#.#.. ###.### ...@... ###.### ..#.#.. ..#.#.. 0 0
Sample Output
45 59 6 13
HINT
Source#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
int W,H,x,y,step;
char mapp[30][30];
bool vis[30][30]; //标记该块砖是否算过
int mx[4]={0,0,-1,1}; //点的移动
int my[4]={-1,1,0,0};
bool check(int x,int y) //判断下一块砖是否可以被计算
{
if(x<0||x>=H||y<0||y>=W||mapp[x][y]=='#'||vis[x][y]==true)
return false;
return true;
}
void dfs(int x,int y)
{
step++;
vis[x][y]=true;
for(int i=0;i<4;i++)
{
int nx,ny;
nx=x+mx[i];
ny=y+my[i];
if(check(nx,ny))
{
dfs(nx,ny);
}
}
}
int main()
{
while(~scanf("%d%d",&W,&H)&&(W||H))
{
for(int i=0;i<H;i++)
scanf("%s",mapp[i]);
memset(vis,false,sizeof(vis));
for(int i=0;i<H;i++)
{
for(int j=0;j<W;j++)
{
if(mapp[i][j]=='@')
{
x=i;
y=j;
vis[i][j]=true;
}
}
}
step=0;
dfs(x,y); //函数返回值为step
printf("%d\n",step);
}
return 0;
}
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
int W,H,x,y,step;
char mapp[30][30];
bool vis[30][30]; //标记该块砖是否算过
int mx[4]={0,0,-1,1}; //点的移动
int my[4]={-1,1,0,0};
bool check(int x,int y) //判断下一块砖是否可以被计算
{
if(x<0||x>=H||y<0||y>=W||mapp[x][y]=='#'||vis[x][y]==true)
return false;
return true;
}
void dfs(int x,int y)
{
step++;
vis[x][y]=true;
for(int i=0;i<4;i++)
{
int nx,ny;
nx=x+mx[i];
ny=y+my[i];
if(check(nx,ny))
{
dfs(nx,ny);
}
}
}
int main()
{
while(~scanf("%d%d",&W,&H)&&(W||H))
{
for(int i=0;i<H;i++)
scanf("%s",mapp[i]);
memset(vis,false,sizeof(vis));
for(int i=0;i<H;i++)
{
for(int j=0;j<W;j++)
{
if(mapp[i][j]=='@')
{
x=i;
y=j;
vis[i][j]=true;
}
}
}
step=0;
dfs(x,y); //函数返回值为step
printf("%d\n",step);
}
return 0;
}