1.题意:一位公主被困在迷宫里,一位勇士前去营救,迷宫为两层,规模为N*M,迷宫入口为(0,0,0),公主的位置用'P'标记;迷宫内,'.'表示空地,'*'表示墙,特殊的,'#'表示时空传输机,走到这里就会被传输到另一层的相对位置;在迷宫内没走动一步耗时为1,最终求解是否能在T时刻解救到公主;
2.输入输出:第一行C表示C组数据,每一组内N,M,T给出的迷宫规模与时间,接着给出了双层迷宫的内容;若是能找到公主输出"YES",否则"NO";
3.分析:这里原题意判断是否能在T时刻找到,然而要是写搜索判断有没有"时刻为T且位置为P"的状态,会超时,所以直接判断能不能在T时刻之前就找到;
BFS版:求出到达P处的最短时间并判断是否小于T;DFS版:找到第一个"时刻小于T且位置为P的状态"就返回;
1 # include2 # include 3 # include 4 # include 5 using namespace std; 6 const int maxn=15; 7 int N,M,T; 8 int dx[4]={ 0,0,-1,1}; 9 int dy[4]={-1,1,0,0};10 char maze[2][maxn][maxn];11 int vis[2][maxn][maxn];12 struct Node13 {14 int l,x,y,t;15 Node(){}16 Node(int ll,int xx,int yy,int tt)17 {18 l=ll;19 x=xx;20 y=yy;21 t=tt;22 }23 };24 void Init()25 {26 scanf("%d%d%d",&N,&M,&T);27 for(int i=0;i<2;i++)28 for(int j=0;j Q;36 vis[0][0][0]=1;37 Q.push(Node(0,0,0,0));38 while(!Q.empty())39 {40 Node temp=Q.front();41 Q.pop();42 if(temp.t<=T&&maze[temp.l][temp.x][temp.y]=='P')43 {44 ans=1;45 break;46 }47 if(temp.t>T) break;48 for(int i=0;i<4;i++)49 {50 int nx=temp.x+dx[i];51 int ny=temp.y+dy[i];52 if(nx>=0&&ny>=0&&nx 0) printf("YES\n");69 else printf("NO\n");70 }71 int main()72 {73 //freopen("in.txt","r",stdin);74 //freopen("out.txt","w",stdout);75 int C;76 scanf("%d",&C);77 while(C--)78 {79 Init();80 Solve();81 } 82 return 0;83 }
1 # include2 # include 3 # include 4 # include 5 using namespace std; 6 const int MAXN=15; 7 char Maze[2][MAXN][MAXN]; 8 int dx[4]={ 1,-1,0,0}; 9 int dy[4]={ 0,0,1,-1};10 int vis[2][MAXN][MAXN];11 int N,M,T,f;12 void Init()13 {14 f=0;15 scanf("%d%d%d",&N,&M,&T);16 for(int k=0;k<2;k++)17 for(int i=0;i =0&&ny>=0&&nx