版权声明:转载请注明出处 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;
}