《算法竞赛从入门到进阶》第四章 搜索技术 hdu1312 "Red and Black" BFS

Posted chrysanthemum

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了《算法竞赛从入门到进阶》第四章 搜索技术 hdu1312 "Red and Black" BFS相关的知识,希望对你有一定的参考价值。

#include<iostream>
#include<cstdio>
#include<queue>
using namespace std;
char room[25][25];
int dir[4][2]={{-1,0},{0,-1},{1,0},{0,1}};
int Wx,Hy,num;
//Wx,Hy:长宽的边界 ,num:从初始瓷砖到能到达的瓷砖的总数 
#define CHECK(x,y) (x<Wx&&x>=0&&y>=0&&y<Hy) 
//检查是否越界 
struct node
{
    int x,y; 
};
void BFS(int dx,int dy)
{
    queue<node> q;
    node start,next;
    start.x = dx;
    start.y = dy;
    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.x,next.y)&&room[next.x][next.y]==.)
            {
                room[next.x][next.y]=#;//标记一下当前节点已经走过了 
                num++;//步数自增 
                q.push(next);//将子节点入队 
            }
        }
    } 
}
int main()
{
    int x,y,dx,dy; 
    //dx,dy: 人的站位 
    while(cin>>Wx>>Hy)
    {
        if(Wx==0&&Hy==0)
        {
            break;
        }
        for(y=0;y<Hy;++y)
        {
            for(x=0;x<Wx;++x)
            {
                cin>>room[x][y];
                if(room[x][y]==@)
                {
                    dx=x;
                    dy=y; 
                } 
            }
        }
        
        num=1;
        BFS(dx,dy);
        cout<<num<<endl;
    }
    return 0;
 } 

 

以上是关于《算法竞赛从入门到进阶》第四章 搜索技术 hdu1312 "Red and Black" BFS的主要内容,如果未能解决你的问题,请参考以下文章

算法竞赛从入门到进阶

2021算法竞赛入门班第四节课搜索练习题

算法竞赛入门经典 第四章

算法竞赛入门码蹄集进阶塔335题(MT2286-2290)

《算法竞赛进阶指南》0x23剪枝 POJ1190上下界搜索与剪枝

《算法竞赛进阶指南》0x27A* 八数码问题 POJ1077