题解 P2298 【Mzc和男家丁的游戏】

· · 题解

相信各位同志发现,这一道题是一个标准的BFS

进入正题......

#include <bits/stdc++.h>

using namespace std;

char mp[2000][2000];int vis[2000][2000],next[4][2]={{-1,0},{1,0},{0,-1},{0,1}};//定义地图,vis是记录走过的格子。 
//next是走下一步的坐标变化 
int cnt,flag=0;//定义步数和判断是否到达终点的变量 

struct Node//结构体,定义一个节点 
{
    int x,y,s;//定义这一个节点的坐标(x,y),以及走到这个节点的步数。 

    Node(int _x,int _y,int _s)
    {
        x=_x;y=_y;s=_s;
    }//这里只是一种简洁的方法,也可以直接在BFS()里赋值 
};

int BFS()//广搜函数 
{
    queue <Node> v;int n,m,sx,sy;cin>>n>>m;
    //定义一个STL库里的队列,和地图长宽以及起始地点 
    for(int i=0;i<n;i++) 
        for(int j=0;j<m;j++)
        {
            cin>>mp[i][j];//输入地图 

            if(mp[i][j]=='m')
            {
                sx=i;sy=j;//如果发现了起点那就将起始地点变量赋值 
            } 
        }
    Node temp_cci(sx,sy,0);v.push(temp_cci);//将起始地点压入队列 

    while(!v.size()==0) 
    {
        Node head=v.front();v.pop();//将这一个节点记录到head里,准备往下搜索 

        if(mp[head.x][head.y]=='d')//如果head已经是终点 
        {
            cnt=head.s;flag=1;break;//那就给这两个变量赋值,并break 
        }

        for(int i=0;i<4;i++)//往下搜索 
        {
            int tx=head.x+next[i][0];//往一个方向的x坐标变化 
            int ty=head.y+next[i][1];//往一个方向的y坐标变化
            //结成一个点 
            if(tx<0||ty<0||tx>=n||ty>=m||vis[tx][ty]==1||mp[tx][ty]=='#') continue;
            //如果超出边界,点已经被走过,是障碍,全部跳过(毫不留情) 
            Node temp(tx,ty,head.s+1);v.push(temp);vis[tx][ty]=1;//如果没有被跳过,那就把点压入队列,准备下一次搜索 
        }
    }
}

int main()
{
    BFS(); 

    if(flag) cout<<cnt;//如果找到了终点,输出步数 

    else cout<<"No Way!";//没有?输出No Way(注意N和W要大写) 
}

请勿抄袭,否则..

---------------祝通过---------------