杭电ACM1312——Red and Black~~广搜

这一题,简单的广搜或者深搜都可以搞定,时间复杂度都差不多。

我用的是广搜。题目的意思是:@是一个人的起始位置,#不可以走,. 可以走,求出可以走的位置的个数。

一开始没有用结构体来存储坐标,直接用的是z = x * 10 + y;将z入队,结果错了,原因是在取余整除的时候会出错。改用结构体就OK了。

下面是AC的代码:

#include 
#include 
#include 
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  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;
}


你可能感兴趣的:(杭电)