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 # include <iostream> 2 # include <cstdio> 3 # include <queue> 4 # include <cstring> 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 Node 13 { 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<N;j++) 29 scanf("%s",maze[i][j]); 30 memset(vis,0,sizeof(vis)); 31 } 32 void Solve() 33 { 34 int ans=-1; 35 queue<Node> 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<N&&ny<M&&maze[temp.l][nx][ny]!=‘*‘&&!vis[temp.l][nx][ny]) 53 { 54 if(maze[temp.l][nx][ny]!=‘#‘)//"." 55 { 56 vis[temp.l][nx][ny]=1; 57 Q.push(Node(temp.l,nx,ny,temp.t+1)); 58 } 59 else//‘#‘ 60 { 61 vis[temp.l][nx][ny]=vis[!temp.l][nx][ny]=1; 62 if(maze[!temp.l][nx][ny]!=‘*‘&&maze[!temp.l][nx][ny]!=‘#‘) 63 Q.push(Node(!temp.l,nx,ny,temp.t+1)); 64 } 65 } 66 } 67 } 68 if(ans>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 # include <iostream> 2 # include <cstdio> 3 # include <cstring> 4 # include <cstdlib> 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<N;i++) 18 scanf("%s",Maze[k][i]); 19 memset(vis,0,sizeof(vis)); 20 } 21 void dfs(int k,int x,int y,int t) 22 { 23 if(f) return; 24 if(t<T&&Maze[k][x][y]==‘P‘) 25 { 26 f=1; 27 return; 28 } 29 if(t==T) 30 { 31 if(Maze[k][x][y]==‘P‘) 32 f=1; 33 return; 34 } 35 for(int i=0;i<4;i++) 36 { 37 int nx=x+dx[i]; 38 int ny=y+dy[i]; 39 if(nx>=0&&ny>=0&&nx<N&&ny<M&&Maze[k][nx][ny]!=‘*‘) 40 { 41 if(Maze[k][nx][ny]!=‘#‘&&!vis[k][nx][ny]) 42 { 43 vis[k][nx][ny]=1; 44 dfs(k,nx,ny,t+1); 45 vis[k][nx][ny]=0; 46 } 47 else 48 { 49 if(Maze[!k][nx][ny]!=‘#‘&&Maze[!k][nx][ny]!=‘*‘) 50 if(!vis[k][nx][ny]&&!vis[!k][nx][ny]) 51 { 52 vis[!k][nx][ny]=vis[k][nx][ny]=1; 53 dfs(!k,nx,ny,t+1); 54 vis[!k][nx][ny]=vis[k][nx][ny]=0; 55 } 56 } 57 } 58 } 59 } 60 void Solve() 61 { 62 dfs(0,0,0,0); 63 if(f) printf("YES\n"); 64 else printf("NO\n"); 65 } 66 int main() 67 { 68 //freopen("in.txt","r",stdin); 69 //freopen("out.txt","w",stdout); 70 int C; 71 scanf("%d",&C); 72 while(C--) 73 { 74 Init(); 75 Solve(); 76 } 77 return 0; 78 }
时间: 2024-12-20 12:54:24