【BFS】hdu 1312 Red and Black

题目描述:

http://acm.hdu.edu.cn/showproblem.php?pid=1312

 

中文大意:

一个长方形的房间,铺着方砖,每块方砖被标记为 # 或黑点. 。

一个人站在起点 @ ,可以上、下、左、右移动,但只能移动到标记为黑点的方砖上,不能移动到标记为 # 的方砖上。

要求:求可遍历到的黑点数目。

 

思路:

(1)把起点 s 放到队列 q 中;
(2)如果 q 是空队列,则过程结束,否则继续;
(3)取队列 q 中最前面的节点 node;
(4)尝试访问 node 节点的四周节点。若没有后继节点,则转到(2);
(5)把 node 的所有后继节点放在队列 q 的末端,并标记为不可再被访问;
(6)转到(2)。

如果有目标节点,则将(6)改为:若后继节点中某一个是目标节点,则找到一个解,过程结束,否则转到(2)。

 

代码:

#include<bits/stdc++.h>
using namespace std;
struct node
{
    int x,y;
};

int dir[4][2] = {
{0, -1}, //
{1, 0}, //
{0, 1}, //
{-1, 0} //
};

int w,h;
char** room;

bool check(node tem)
{
    if(tem.x>=0&&tem.x<w&&tem.y>=0&&tem.y<h)
    {
        return true;
    }
    return false;
}

void BFS(int dx, int dy)
{
    int num = 1;
    
    node start, next;
    start.x = dx;
    start.y = dy;
    
    queue<node> q;
    q.push(start);
    
    while(!q.empty())
    {
        start = q.front();
        q.pop();
        //尝试四个方向 
        for(int i=0;i<4;i++) 
        {
            next.x = start.x + dir[i][0];
            next.y = start.y + dir[i][1];
            if(check(next)&&room[next.y][next.x]=='.')
            {
                room[next.y][next.x] = '#';
                num++;
                q.push(next);
            }
        }
    }
    printf("%d\n", num);
}

int main()
{
    while(scanf("%d%d", &w, &h)&&(w!=0&&h!=0))
    {
        int dx, dy;
        room = new char*[h];
        for(int i=0;i<h;i++)
        {
            room[i] = new char[w];
            scanf("%s", room[i]);
            for(int j=0;j<w;j++)
            {
                if(room[i][j] == '@')
                {
                    dx = j;
                    dy = i;
                    break;
                }
            }
        }
        
        BFS(dx, dy);
    }
}

 

posted @ 2021-01-18 22:43  狂奔的小学生  阅读(165)  评论(0编辑  收藏  举报