BFS+状态压缩
跟1429很想,重敲了一遍,加深了理解吧
有些问题没理清造成了bug
1.门next.state&t 钥匙next.state|=t
有无赋值很重要,不能弄混
2.最后的else if 不光是’通道’的情况,还有出口的情况,不然出口无法入队,就无法访问,ans恒为-1
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<queue>
#include<stack>
#include<math.h>
#include<vector>
#include<algorithm>
#include<iostream>
using namespace std;
const int N = 105;
const int M = 105;
const int inf = 1000000007;
const int mod = 1000000007;
int n,m,ans;
char map[N][M];
int sx,sy,ex,ey;
int vis[N][M][1<<5];
struct node{
int x;
int y;
int step;
int state;
};
int dir[4][2]={{1,0},{-1,0},{0,1},{0,-1}};
bool judge(int x,int y){
if(x>=1&&x<=n&&y>=1&&y<=m &&map[x][y]!='#')return true;
else return false;
}
void BFS(){
memset(vis,0,sizeof(vis));
int t;
node a,next;
a.x=sx;
a.y=sy;
a.step=0;
a.state=0;
queue<node> q;
vis[a.x][a.y][a.state]=1;
q.push(a);
while(!q.empty()){
a=q.front();
q.pop();
//cout<<map[a.x][a.y]<<" "<<a.step<<" "<<a.state<<endl;
if(map[a.x][a.y]=='X'){
ans=a.step;
return;
}
for(int i=0;i<=3;i++){
next.x=a.x+dir[i][0];
next.y=a.y+dir[i][1];
next.step=a.step+1;
next.state=a.state;
if(judge(next.x,next.y)){///非墙
if(map[next.x][next.y]=='b'){
t=1<<0;
next.state|=t;
if(vis[next.x][next.y][next.state]==0){
vis[next.x][next.y][next.state]=1;
q.push(next);
}
}
else if(map[next.x][next.y]=='y'){
t=1<<1;
next.state|=t;
if(vis[next.x][next.y][next.state]==0){
vis[next.x][next.y][next.state]=1;
q.push(next);
}
}
else if(map[next.x][next.y]=='r'){
t=1<<2;
next.state|=t;
if(vis[next.x][next.y][next.state]==0){
vis[next.x][next.y][next.state]=1;
q.push(next);
}
}
else if(map[next.x][next.y]=='g'){
t=1<<3;
next.state|=t;
if(vis[next.x][next.y][next.state]==0){
vis[next.x][next.y][next.state]=1;
q.push(next);
}
}
else if(map[next.x][next.y]=='B'){
t=1<<0;
if((next.state&t)&&vis[next.x][next.y][next.state]==0){
vis[next.x][next.y][next.state]=1;
q.push(next);
}
}
else if(map[next.x][next.y]=='Y'){
t=1<<1;
if((next.state&t)&&vis[next.x][next.y][next.state]==0){
vis[next.x][next.y][next.state]=1;
q.push(next);
}
}
else if(map[next.x][next.y]=='R'){
t=1<<2;
if((next.state&t)&&vis[next.x][next.y][next.state]==0){
vis[next.x][next.y][next.state]=1;
q.push(next);
}
}
else if(map[next.x][next.y]=='G'){
t=1<<3;
if((next.state&t)&&vis[next.x][next.y][next.state]==0){
vis[next.x][next.y][next.state]=1;
q.push(next);
}
}
else if(vis[next.x][next.y][next.state]==0){///是'通道'或者是'出口'的情况
vis[next.x][next.y][next.state]=1;
q.push(next);
}
}
}
}
}
int main()
{
while(cin>>n>>m&& n+m){
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
cin>>map[i][j];
if(map[i][j]=='*'){sx=i;sy=j;}
if(map[i][j]=='X'){ex=i;ey=j;}
}
}
ans=-1;
BFS();
if(ans==-1)cout<<"The poor student is trapped!"<<endl;
else cout<<"Escape possible in "<<ans<<" steps."<<endl;
}
return 0;
}