蓝桥刷题 --Dungeon Master
第一种DFS写法 (超时)
#pragma GCC positionimize(3,"Otrst","inline") //#include "emplace.hpp" //#include<bits/stdc++.h> #include<iostream> #include<cstdio> #include<cmath> #include<cstdlib> #include<cstring> #include<string> #include<algorithm> #include<queue> using namespace std; typedef long long ll; const int N=1e6+10; const int INF=0x3f3f3f; const double pi = 3.141592653; const double E = 2.71828182846; const ll mod=1e9+7; const int M=1e3+5; const double eps=1e-8; #define ci(x) scanf("%d",&x) #define co(x) printf("%d\n",x) using namespace std; int L,C,R; char str[35][35][35]; int vis[35][35][35]={0}; int dx[5]={0,0,1,-1}; int dy[5]={1,-1,0,0}; int dis[6][3]={{1,0,0},{-1,0,0},{0,1,0},{0,-1,0},{0,0,1},{0,0,-1}}; bool flag=false; int dfs(int l,int r,int c) { if(str[l][r][c]=='E') { return 0; } int ans = INF; for(int i=0;i<6;i++) { int ll=l+dis[i][0]; int rr=r+dis[i][1]; int cc=c+dis[i][2]; if(ll<0||ll>=L||rr<0||rr>=R||cc<0||cc>=C ||vis[ll][rr][cc]==true||str[ll][rr][cc]=='#') { continue; } vis[ll][rr][cc]=true; ans=min(ans,dfs(ll,rr,cc)); vis[ll][rr][cc]=false; } return (ans!=INF)? ans+1:INF; } int main() { while(~scanf("%d %d %d",&L,&R,&C)){ if(L==0&&R==0&C==0) break; for(int i=0;i<L;i++) { for(int j=0;j<R;j++) { scanf("%s",str[i][j]); } } /*for(int i=0;i<L;i++) { for(int j=0;j<R;j++) { printf("%s\n",str[i][j]); } }*/ int ans=dfs(0,0,0); if(ans!=INF) { printf("Escaped in %d minute(s).\n",ans); } else { puts("Trapped!"); } } //printf("%d\n",ans); return 0; }
BFS写法 AC 注意数组需要进行初始化
#pragma GCC positionimize(3,"Otrst","inline") //#include "emplace.hpp" //#include<bits/stdc++.h> #include<iostream> #include<cstdio> #include<cmath> #include<cstdlib> #include<cstring> #include<string> #include<algorithm> #include<queue> using namespace std; typedef long long ll; const int N=1e6+10; const int INF=0x3f3f3f; const double pi = 3.141592653; const double E = 2.71828182846; const ll mod=1e9+7; const int M=1e3+5; const double eps=1e-8; #define ci(x) scanf("%d",&x) #define co(x) printf("%d\n",x) using namespace std; int L,C,R; char str[35][35][35]; bool vis[35][35][35]; int dx[5]={0,0,1,-1}; int dy[5]={1,-1,0,0}; int dis[6][3]={{1,0,0},{-1,0,0},{0,1,0},{0,-1,0},{0,0,1},{0,0,-1}}; //使用DFS超时 /*int dfs(int l,int r,int c) { if(str[l][r][c]=='E') { return 0; } int ans = INF; for(int i=0;i<6;i++) { int ll=l+dis[i][0]; int rr=r+dis[i][1]; int cc=c+dis[i][2]; if(ll<0||ll>=L||rr<0||rr>=R||cc<0||cc>=C ||vis[ll][rr][cc]==true||str[ll][rr][cc]=='#') { continue; } vis[ll][rr][cc]=true; ans=min(ans,dfs(ll,rr,cc)); vis[ll][rr][cc]=false; } return (ans!=INF)? ans+1:INF; }*/ //BFS struct step{ int x,y,z; int val; }; int bfs(int l,int r,int c) { queue<step> q; step p={l,r,c,0}; q.push(p); while(!q.empty()) { step s=q.front(); q.pop(); for(int i=0;i<6;i++) { step next={s.x+dis[i][0],s.y+dis[i][1],s.z+dis[i][2],s.val+1}; if(next.x<0||next.x>=L||next.y<0||next.y>=R||next.z<0||next.z>=C|| vis[next.x][next.y][next.z]==true||str[next.x][next.y][next.z]=='#') { continue; } else if(str[next.x][next.y][next.z]=='E') { return next.val; } vis[next.x][next.y][next.z]=true; q.push(next); } } return INF; } int main() { while(~scanf("%d %d %d",&L,&R,&C)){ if(L==0&&R==0&C==0) break; memset(vis,false,sizeof(vis)); int dx,dy,dz; for(int i=0;i<L;i++) { for(int j=0;j<R;j++) { scanf("%s",str[i][j]); for(int k=0;k<C;k++) { if(str[i][j][k]=='S') { dx=i; dy=j; dz=k; } } } } /*for(int i=0;i<L;i++) { for(int j=0;j<R;j++) { printf("%s\n",str[i][j]); } }*/ int ans=bfs(dx,dy,dz); if(ans!=INF) { printf("Escaped in %d minute(s).\n",ans); } else { puts("Trapped!"); } } //printf("%d\n",ans); return 0; }
所有内容仅供自己学习记录使用
如有错误可直接指出