简单BFS - 走迷宫

版权声明:转载请注明出处 https://blog.csdn.net/weixin_42557561/article/details/86607419
描述

L上次旅行进入了一个迷宫,他被困在了一个N*M的矩形迷宫中。L开始在左上角的点,他知道出口在右下角,他可以向四个方向移动到相邻的点。不过这个迷宫有些魔法,每个格子有一种颜色,不同的颜色代表不一样的功能:
如果格子是红色的,表示当前格子无法通行
如果格子是粉红,表示格子可以正常通行
如果是橙色,当前格子也可以通行,不过会让L身上散发臭气
如果是蓝色,这个格子里有鳄鱼,如果L想通过身上要带有臭气。
如果格子是紫色的,L会自动沿原来方向滑向下个格子,下个格子还是紫色会一直滑动,直到落到一个非紫色格子,或者碰到一个不能通行的格子。同时紫色格子会消除L身上的气味

L已经头晕,他找到你,希望你能帮他求出他最少移动多少次可以到达终点,如果不能到输出-1

输入
第一行2个整数,N,M表示行数和列数
接下来N行m列,表示迷宫
0表示红色,1表示粉红,2表示橙色,3表示蓝色,4表示紫色
左上角和右下角的数一定是1

输出
最少移动次数,或者-1

样例输入
4 4
1 0 2 1
1 1 4 1
1 0 4 0
1 3 1 1
样例输出
10
提示
【样例解释】 L先向下走1步,然后向右2步,滑行1步,向上走1步,向左1步,向下1步,滑行2步,向右1步,一共10步 【数据规模】 1<=n,m<=1000

标签
usaco2015dec


Analysis

啊啊啊啊……悲伤
果然颓了太久,连 bfs 和 dfs 都不分了,难受(╯﹏╰)
敲了好久的DFs,不停死循环
打着bfs的头号,写了一发dfs
然后改用dp????写完了一调,发现完全不对啊

以后一定要想清楚了再动手
和最短路有关,肯定是BFs啊

没什么好分析的,就是搜啊……

Code

#include<bits/stdc++.h>
#define in read()
#define int long long
#define re register
using namespace std;
inline int read(){
	char ch;int f=1,res=0;
	while((ch=getchar())<'0'||ch>'9') if(ch=='-') f=-1;
	while(ch>='0'&&ch<='9'){
		res=(res<<1)+(res<<3)+(ch^48);
		ch=getchar();
	}
	return f==1?res:-res;
}
const int N=2009;
int n,m,col[N][N],ans=(1ll<<62);
bool vis[N][N][2];
int f[N][N][3];
int d[4][2]={-1,0,0,1,0,-1,1,0};
struct node{int x,y,stp,cl;};
inline int check(int x,int y,int c){
	if(!col[x][y]) return 0;
	if(col[x][y]==3) return c;
	return 1;
}
void bfs(){
	queue<node> q;
	f[1][1][0]=0;q.push((node){1,1,0,0});
	while(!q.empty()){
		node a=q.front();q.pop();
		for(re int i=0;i<4;++i){
			int xx=a.x+d[i][0];
			int yy=a.y+d[i][1];
			int nstp=a.stp+1,ncl=a.cl;
			if(!check(xx,yy,ncl)) continue;
			while(col[xx][yy]==4){
				int nx=xx+d[i][0],ny=yy+d[i][1];
				if(!check(nx,ny,ncl)) break;
				xx+=d[i][0];yy+=d[i][1];nstp++;ncl=0;
			}
			if(col[xx][yy]==2) ncl=1;
			if(f[xx][yy][ncl]<=nstp) continue;
			f[xx][yy][ncl]=nstp;
			q.push((node){xx,yy,nstp,ncl});
		}
	}
}
signed main(){
	n=in;m=in;
	for(re int i=1;i<=n;++i)
		for(re int j=1;j<=m;++j)
			col[i][j]=in;
	memset(f,127/3,sizeof(f));	
	int inf=f[0][0][0];
	bfs();
	if(f[n][m][0]!=inf||f[n][m][1]!=inf) cout<<min(f[n][m][0],f[n][m][1]);
	else cout<<-1;
	return 0;
}

猜你喜欢

转载自blog.csdn.net/weixin_42557561/article/details/86607419