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