题目链接:点我啊╭(╯^╰)╮
题目大意:
三维搜索最短路径
解题思路:
BFS与DFS都行,但这里只需要求最短路径, 为 ,所以用BFS更合适???!!!
代码思路:
搜索模板,这里给出BFS和DFS两种解题代码,但DFS是过不了滴
核心:无
BFS:
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
int L, R, C;
int dx[]= {1,-1,0,0,0,0};
int dy[]= {0,0,1,-1,0,0};
int dk[]= {0,0,0,0,1,-1};
bool vis[50][50][50];
char mp[50][50][50];
struct Node {
int l, r, c, tot;
} st;
bool judge(int x, int y, int z) {
return (x>=1 && y>=1 && z>=1 &&\
x<=L && y<=R && z<=C &&\
!vis[x][y][z] &&
mp[x][y][z]!='#');
}
int bfs(int l, int r, int c) {
queue <Node> q;
Node a;
a.l=l;
a.r=r;
a.c=c;
a.tot=0;
q.push(a);
while(!q.empty()) {
a=q.front();
q.pop();
if(mp[a.l][a.r][a.c]=='E') return a.tot;
for(int i=0; i<6; i++) {
Node n;
n.l=a.l+dx[i];
n.r=a.r+dy[i];
n.c=a.c+dk[i];
if(judge(n.l, n.r, n.c)) {
n.tot=a.tot+1;
vis[n.l][n.r][n.c]=true;
q.push(n);
}
}
}
return 0;
}
int main() {
while(scanf("%d%d%d", &L, &R, &C), L) {
getchar();
memset(vis, 0, sizeof(vis));
for(int i=1; i<=L; i++) {
for(int j=1; j<=R; j++) {
for(int k=1; k<=C; k++) {
scanf("%c", &mp[i][j][k]);
if(mp[i][j][k]=='S')
st.l=i, st.r=j, st.c=k;
}
getchar();
}
getchar();
}
int ans = bfs(st.l, st.r, st.c);
if(!ans) printf("Trapped!\n");
else printf("Escaped in %d minute(s).\n", ans);
}
return 0;
}
DFS:
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int INF=0x3F3F3F3F;
int L, R, C, ans, tot;
int dx[]= {1,-1,0,0,0,0};
int dy[]= {0,0,1,-1,0,0};
int dk[]= {0,0,0,0,1,-1};
bool vis[50][50][50];
char mp[50][50][50];
struct Node {
int l, r, c;
} st;
bool judge(int x, int y, int z){
return (x>=1 && y>=1 && z>=1 &&\
x<=L && y<=R && z<=C &&\
!vis[x][y][z] &&
mp[x][y][z]!='#');
}
void dfs(int l, int r, int c) {
if(mp[l][r][c]=='E'){
ans=min(ans, tot);
return;
}
if(tot>ans) return;
for(int i=0; i<6; i++) {
int x=l+dx[i];
int y=r+dy[i];
int k=c+dk[i];
if(judge(x, y, k)) {
vis[x][y][k]=true;
tot++;
dfs(x, y, k);
tot--;
vis[x][y][k]=false;
}
}
}
int main() {
while(scanf("%d%d%d", &L, &R, &C), L) {
getchar();
ans=INF;
tot=0;
memset(vis, 0, sizeof(vis));
for(int i=1; i<=L; i++) {
for(int j=1; j<=R; j++) {
for(int k=1; k<=C; k++) {
scanf("%c", &mp[i][j][k]);
if(mp[i][j][k]=='S')
st.l=i, st.r=j, st.c=k;
}
getchar();
}
getchar();
}
dfs(st.l, st.r, st.c);
if(ans==INF) printf("Trapped!\n");
else printf("Escaped in %d minute(s).\n", ans);
}
return 0;
}