题目大意: 给定一个N*M(N,M<=20)字符串的矩阵,其中@代表人所在的位置,#代表黑色(人不能通过) .代表红色(人们可以通过),求出人们可以通过的最大方块数。
题目分析:简单的建图DFS,不过注意cin读入字符串是从0开始读入的,所以建图时要注意这一点.
如下代码:
#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cstring>
using namespace std;
int n,m,map[21][21],X,Y,cnt=0;
int Dx[5]={-1,1,0,0};
int Dy[5]={0,0,-1,1};
bool v[21][21];
char str[21][21];
void dfs(int x,int y)
{
v[x][y]=true;
for(int i=0;i<=3;i++)
{
int dx=x+Dx[i];
int dy=y+Dy[i];
if(dx>=1&&dx<=n&&dy>=1&&dy<=m&&!v[dx][dy]&&map[dx][dy]==1)
{
cnt++;
dfs(dx,dy);
}
}
}
int main()
{
while(scanf("%d%d",&m,&n)!=EOF)
{
if(n==0&&m==0)
break;
memset(v,false,sizeof(v));
memset(map,-1,sizeof(map));
memset(str,0,sizeof(str));
for(int i=1;i<=n;i++)
{
scanf("%s",&str[i]);
for(int j=0;j<m;j++)
{
if(str[i][j]=='.')
map[i][j+1]=1;
else if(str[i][j]=='@')
{
map[i][j+1]=1;
X=i;
Y=j+1;
}
else
map[i][j+1]=-1;
}
}
/*for(int i=1;i<=n;i++)
{ for(int j=0;j<m;j++)
cout<<str[i][j]<<' ';
cout<<endl;
}
for(int i=1;i<=n;i++)
{ for(int j=1;j<=m;j++)
cout<<map[i][j]<<' ';
cout<<endl;
}*/
cnt=1;
dfs(X,Y);
cout<<cnt<<endl;
}
//while(1);
return 0;
}