题目通道
题解分析
绝对不能用dfs,否则会超时,逐层深入,一旦找到立刻退出,能使用时期望最小。
必备vis入队判重。queue存储队列。
判断continue: 1、已经入队。2、下个方块为rock。3、越界。
判断队列退出:1、队列为空(无解)。2、到达E点(得出解)。
AC代码
#include <iostream>
#include <stdio.h>
#include <string.h>
#include <queue>
#include <algorithm>
using namespace std;
char ma[35][35][35];
int vis[35][35][35];
int k,n,m,sx,sy,sz,ex,ey,ez;
int to[6][3] = {{0,0,1},{0,0,-1},{0,1,0},{0,-1,0},{1,0,0},{-1,0,0}};
struct node
{
int x,y,z,step;
};
int check(int x,int y,int z)
{
if ( x < 0 || y < 0 || z < 0 || x >= k || y >= n || z >= m )
return 1;
if ( ma[x][y][z] == '#' )
return 1;
if ( vis[x][y][z] )
return 1;
return 0;
}
int bfs()
{
node a,nex;
a.x = sx; a.y = sy; a.z = sz; a.step = 0;
queue<node> q;
q.push(a);
memset(vis,0,sizeof(0));
vis[sx][sy][sz] = 1;
while ( q.empty() == 0 ){
a = q.front() ;
q.pop();
if ( a.x == ex && a.y == ey && a.z == ez )
return a.step;
for (int i = 0; i < 6; i++ ){
nex.x = a.x + to[i][0];
nex.y = a.y + to[i][1];
nex.z = a.z + to[i][2];
nex.step = a.step + 1;
if(check(nex.x,nex.y,nex.z))
continue;
vis[nex.x][nex.y][nex.z] = 1;
q.push(nex);
}
}
return 0;
}
int main()
{
int i,j,r;
while(scanf("%d%d%d",&k,&n,&m),n+m+k)
{
for(i = 0; i<k; i++)
{
for(j = 0; j<n; j++)
{
scanf("%s",ma[i][j]);
for(r = 0; r<m; r++)
{
if(ma[i][j][r] == 'S')
{
sx = i,sy = j,sz = r;
}
else if(ma[i][j][r] == 'E')
{
ex = i,ey = j,ez = r;
}
}
}
}
memset(vis,0,sizeof(vis));
int ans;
ans = bfs();
if(ans)
printf("Escaped in %d minute(s).\n",ans);
else
printf("Trapped!\n");
}
return 0;
}
不同写法(输出处理)
#include <iostream>
#include <stdio.h>
#include <string.h>
#include <queue>
#include <algorithm>
using namespace std;
char ma[35][35][35];
int vis[35][35][35];
int k,n,m,sx,sy,sz,ex,ey,ez;
int to[6][3] = {{0,0,1},{0,0,-1},{0,1,0},{0,-1,0},{1,0,0},{-1,0,0}};
struct node
{
int x,y,z,step;
};
int check(int x,int y,int z)
{
if ( x < 0 || y < 0 || z < 0 || x >= k || y >= n || z >= m )
return 1;
if ( ma[x][y][z] == '#' )
return 1;
if ( vis[x][y][z] )
return 1;
return 0;
}
void bfs()
{
node a,nex;
a.x = sx; a.y = sy; a.z = sz; a.step = 0;
queue<node> q;
q.push(a);
memset(vis,0,sizeof(0));
vis[sx][sy][sz] = 1;
while ( q.empty() == 0 ){
a = q.front() ;
q.pop();
if ( a.x == ex && a.y == ey && a.z == ez ){
printf("Escaped in %d minute(s).\n",a.step);
return;
}
for (int i = 0; i < 6; i++ ){
nex.x = a.x + to[i][0];
nex.y = a.y + to[i][1];
nex.z = a.z + to[i][2];
nex.step = a.step + 1;
if(check(nex.x,nex.y,nex.z))
continue;
vis[nex.x][nex.y][nex.z] = 1;
q.push(nex);
}
}
printf("Trapped!\n");
}
int main()
{
int i,j,r;
while(scanf("%d%d%d",&k,&n,&m),n+m+k)
{
for(i = 0; i<k; i++)
{
for(j = 0; j<n; j++)
{
scanf("%s",ma[i][j]);
for(r = 0; r<m; r++)
{
if(ma[i][j][r] == 'S')
{
sx = i,sy = j,sz = r;
}
else if(ma[i][j][r] == 'E')
{
ex = i,ey = j,ez = r;
}
}
}
}
memset(vis,0,sizeof(vis));
bfs();
}
return 0;
}
不同写法( 【0,l )与 【1,l 】)
#include <iostream>
#include <stdio.h>
#include <string.h>
#include <queue>
#include <algorithm>
using namespace std;
char ma[35][35][35];
int vis[35][35][35];
int k,n,m,sx,sy,sz,ex,ey,ez;
int to[6][3] = {{0,0,1},{0,0,-1},{0,1,0},{0,-1,0},{1,0,0},{-1,0,0}};
struct node
{
int x,y,z,step;
};
int check(int x,int y,int z)
{
if ( x <= 0 || y <= 0 || z <= 0 || x > k || y > n || z > m )
return 1;
if ( ma[x][y][z] == '#' )
return 1;
if ( vis[x][y][z] )
return 1;
return 0;
}
void bfs()
{
node a,nex;
a.x = sx; a.y = sy; a.z = sz; a.step = 0;
queue<node> q;
q.push(a);
memset(vis,0,sizeof(0));
vis[sx][sy][sz] = 1;
while ( q.empty() == 0 ){
a = q.front() ;
q.pop();
if ( a.x == ex && a.y == ey && a.z == ez ){
printf("Escaped in %d minute(s).\n",a.step);
return;
}
for (int i = 0; i < 6; i++ ){
nex.x = a.x + to[i][0];
nex.y = a.y + to[i][1];
nex.z = a.z + to[i][2];
nex.step = a.step + 1;
if(check(nex.x,nex.y,nex.z))
continue;
vis[nex.x][nex.y][nex.z] = 1;
q.push(nex);
}
}
printf("Trapped!\n");
}
int main()
{
int i,j,r;
while(scanf("%d%d%d",&k,&n,&m),n+m+k)
{
for(i = 1; i<=k; i++)
{
for(j = 1; j<=n; j++)
{
scanf("%s",ma[i][j]+1);
for(r = 1; r<=m; r++)
{
if(ma[i][j][r] == 'S')
{
sx = i,sy = j,sz = r;
}
else if(ma[i][j][r] == 'E')
{
ex = i,ey = j,ez = r;
}
}
}
}
memset(vis,0,sizeof(vis));
bfs();
}
return 0;
}