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;

}
posted @ 2018-12-08 12:10  一无所知小白龙  阅读(172)  评论(0编辑  收藏  举报