这一题,简单的广搜或者深搜都可以搞定,时间复杂度都差不多。
我用的是广搜。题目的意思是:@是一个人的起始位置,#不可以走,. 可以走,求出可以走的位置的个数。
一开始没有用结构体来存储坐标,直接用的是z = x * 10 + y;将z入队,结果错了,原因是在取余整除的时候会出错。改用结构体就OK了。
下面是AC的代码:
#include <iostream>
#include <queue>
#include <cstdio>
using namespace std;
class data
{
public:
int x, y;
};
char map[25][25];
int W, H;
int start_x, start_y;
int xy[4][2] = {{1,0},{-1,0},{0,1},{0,-1}};
int bfs()
{
int ans = 0;
queue <data> Que;
data tem;
tem.x = start_x; tem.y = start_y;
map[start_x][start_y] = '#';
Que.push(tem);
while(!Que.empty())
{
tem = Que.front();
Que.pop();
ans++;
data temp;
for(int i = 0; i < 4; i++)
{
temp.x = tem.x + xy[i][0];
temp.y = tem.y + xy[i][1];
if(temp.x >= 0 && temp.x < H && temp.y >= 0 && temp.y < W && map[temp.x][temp.y] == '.')
{
map[temp.x][temp.y] = '#';
Que.push(temp);
}
}
}
return ans;
}
int main()
{
// freopen("data.txt", "r", stdin);
while(scanf("%d%d", &W, &H) != EOF)
{
getchar();
if(W == 0 && H == 0)
break;
for(int i = 0; i < H; i++)
{
for(int j = 0; j < W; j++)
{
scanf("%c", &map[i][j]);
if(map[i][j] == '@')
{
start_x = i;
start_y = j;
}
}
getchar();
}
int ans = bfs();
printf("%d\n", ans);
}
return 0;
}