这道题目是最简单的广度优先搜索了。题目要求是从@处开始走,看能走的‘.’的个数,广搜扫一遍。
#include <iostream>
#include <queue>
#include <cstring>
#include <cstdio>
using namespace std;
const int maxn = 20+5;
int W,H;
char maze[maxn][maxn];
bool flag[maxn][maxn];
int start_w,start_h;
int dir[4][2]= {-1,0,1,0,0,-1,0,1};
typedef struct
{
int w;
int h;
}Node;
queue<Node> Q;
void init(int w,int h)
{
memset(maze,0,sizeof(maze));
memset(flag,false,sizeof(flag));
for(int j=0;j<h;j++)
scanf("%s",maze[j]);
}
void BFS()
{
for(int j=0;j<H;j++)
for(int i=0;i<W;i++)
{
if(maze[j][i]=='@')
{
start_h = j;
start_w = i;
}
}
flag[start_h][start_w] = true;
Node s;
s.h = start_h;
s.w = start_w;
Q.push(s);
while(!Q.empty())
{
for(int i=0;i<4;i++)
{
Node ns;
ns.h = Q.front().h + dir[i][0];
ns.w = Q.front().w + dir[i][1];
if(ns.h>=0 && ns.h<H && ns.w>=0 && ns.w<W && flag[ns.h][ns.w] == false && maze[ns.h][ns.w] == '.')
{
Q.push(ns);
flag[ns.h][ns.w] = true;
}
}
Q.pop();
}
}
int main()
{
while(scanf("%d%d",&W,&H)!=EOF)
{
if(W == 0 && H == 0)
break;
init(W,H);
BFS();
int sum = 0;
for(int j=0;j<H;j++)
{
for(int i=0;i<W;i++)
{
if(flag[j][i])
sum++;
}
}
printf("%d\n",sum);
}
return 0;
}