6 9 ....#. .....# ...... ...... ...... ...... ...... #@...# .#..#. 11 9 .#......... .#.#######. .#.#.....#. .#.#.###.#. .#.#..@#.#. .#.#####.#. .#.......#. .#########. ........... 11 6 ..#..#..#.. ..#..#..#.. ..#..#..### ..#..#..#@. ..#..#..#.. ..#..#..#.. 7 7 ..#.#.. ..#.#.. ###.### ...@... ###.### ..#.#.. ..#.#.. 0 0Sample Output
45 59 6 13题解
基础BFS。人可以上下左右移动,红砖就是墙,黑砖可以重复走。将起点放入队列,上下左右四个方向,是没走过的黑砖就将它标记并计数。结果就是人能够到达的所有黑砖数量。
代码
#include<stdio.h>
#include<queue>
#include<string.h>
using namespace std;
struct node
{
int x;
int y;
}now,Next;
int main()
{
char s[30][30]={0};
int use[30][30]={0};
int dir[4][2]={-1,0,0,-1,1,0,0,1};//四个方向
int n,m,i,j;
while(scanf("%d%d",&n,&m))
{
if(n==0&&m==0)break;
queue<node> qu;
memset(use,0,sizeof(use));
int count=1;
for(i=0;i<m;i++)scanf("%s",s[i]);
for(i=0;i<m;i++)//搜寻起点
{
for(j=0;j<n;j++)
{
if(s[i][j]=='@')
{
now.x=i;
now.y=j;
use[i][j]=1;
}
}
}
qu.push(now);//将起点放入队列
while(qu.size())
{
now=qu.front();
qu.pop();
for(i=0;i<4;i++)
{
Next.x=now.x+dir[i][0];
Next.y=now.y+dir[i][1];
if(s[Next.x][Next.y]=='.'&&use[Next.x][Next.y]==0&&Next.x>=0&&Next.x<m&&Next.y>=0&&Next.y<n)//判读是否在地图中并且是没到达过的黑砖
{
use[Next.x][Next.y]=1;//标记该黑砖
count++;//计数
qu.push(Next);
}
}
}
printf("%d\n",count);
}
return 0;
}