4.1迷宫

简单的迷宫,用bfs就好了
解题,1开一个队列,把初始位置放进去
2.取队列中的一个,上下左右走,可以走的放进去队列,然后他的步数加一
3.重复2,直到找到目标或者队列为空,都没找到

#include<iostream>
#include<stdio.h>
#include<stdlib.h>
#include <iomanip>
#include<cmath>
#include<float.h> 
#include<string.h>
#include<algorithm>
#define sf scanf
#define scf(x) scanf("%d",&x)
#define scff(x,y) scanf("%d%d",&x,&y)
#define pf printf
#define prf(x) printf("%d\n",x)
#define mm(x,b) memset((x),(b),sizeof(x))
#include<vector>
#include<queue>
#define rep(i,a,n) for (int i=a;i<n;i++)
#define per(i,a,n) for (int i=a;i>=n;i--)
typedef long long ll;
const ll mod=1e9+100;
const double eps=1e-8;
using namespace std;
const double pi=acos(-1.0);
const int inf=0xfffffff;
const int N=1005;
char a[N][N];
int caozuo[4][2]={1,0,-1,0,0,1,0,-1};
struct Node//记录x,y坐标的走到这的步数
{
    int x,y,ans;
    Node(int a=0,int b=0,int z=0)
    {
        x=a;y=b;ans=z; 
    }
};
queue<Node>v;
void bfs()
{
    Node t;
    while(!v.empty())
    {
        t=v.front();
        v.pop();
        rep(i,0,4)//四面走
        {
            Node tt;
            tt=t; 
            tt.x += caozuo[i][0];
            tt.y += caozuo[i][1];
            tt.ans++;
            if(a[tt.x][tt.y]=='E')//是答案直接输出结束
            {
                prf(tt.ans);
                return ;
            }
            if(a[tt.x][tt.y]!='#')//如果不是墙就放入队列并改变他
            {
                a[tt.x][tt.y]='#';
                v.push(tt);
            }
        }
    }
    pf("-1\n");
}
int main()
{
    int n,m,x,y;
    int temp=1;
    scff(n,m);
    mm(a,'#');
    rep(i,1,n+1)
    {
        sf("%s",a[i]+1);
        if(temp) 
        rep(j,1,m+1)
        {
            if(a[i][j]=='S')
            {
                x=i;y=j;
                temp=0;
            }
        }
        a[i][m+1]='#'; 
    }
    a[x][y]='#';
    v.push(Node(x,y,0)); 
    bfs();
    return 0;

}

猜你喜欢

转载自www.cnblogs.com/wzl19981116/p/10087230.html