传送门:Jelly
题意:在n * n * n的三维空间中每个点上都有一个好果冻或一个坏果冻。计算在不吃坏果冻的前提下,从(1,1,1)到(n,n,n)最少需要吃多少好果冻。
做法:每个有好果冻的点与上下左右前后有好果冻的点有可达边。用spfa即可。
#include
using namespace std;
const int maxn=110;
const int inf=0x3f3f3f3f;
char g[maxn][maxn][maxn];
bool vis[maxn][maxn][maxn];
int d[maxn][maxn][maxn];
int X[]={1,-1,0,0,0,0};
int Y[]={0,0,1,-1,0,0};
int Z[]={0,0,0,0,1,-1};
int n;
bool check(int x,int y,int z){
if((0<x&&x<=n&&0<y&&y<=n&&0<z&&z<=n))
return true;
else return false;
}
struct ac{
int x,y,z;int d;
};
int inq[maxn][maxn][maxn];
void SPFA(){
memset(inq,false,sizeof inq);
memset(d,0x3f,sizeof d);
queue<ac> Q;
Q.push((ac){1,1,1,1});
inq[1][1][1]=true;
d[1][1][1]=1;
while(!Q.empty()){
ac u=Q.front();
Q.pop();
inq[u.x][u.y][u.z]=false;
for(int i=0;i<6;i++){
int vx=u.x+X[i],vy=u.y+Y[i],vz=u.z+Z[i];
if(check(vx,vy,vz)==false||g[vx][vy][vz]=='*') continue;
if(d[vx][vy][vz]>d[u.x][u.y][u.z]+1){
d[vx][vy][vz]=d[u.x][u.y][u.z]+1;
if(inq[vx][vy][vz]==false){
Q.push((ac){vx,vy,vz,d[vx][vy][vz]});
inq[vx][vy][vz]=true;
}
}
}
}
}
int main(){
cin>>n;
for(int i=1;i<=n;++i){
for(int j=1;j<=n;++j){
cin>>(g[i][j]+1);
}
}
SPFA();
if(d[n][n][n]!=inf)
cout<<d[n][n][n]<<endl;
else
cout<<"-1"<<endl;
return 0;
}
传送门:Dungeon Master
题意:.为可以走的点,#为不可以走的,求是否可以从S到E,若可以最少要走多少次。
#include
#include
#include
#include
using namespace std;
const int maxn=110;
const int inf=0x3f3f3f3f;
char g[maxn][maxn][maxn];
bool vis[maxn][maxn][maxn];
int d[maxn][maxn][maxn];
int X[]={1,-1,0,0,0,0};
int Y[]={0,0,1,-1,0,0};
int Z[]={0,0,0,0,1,-1};
int n,m,p;
bool check(int x,int y,int z){
if((0<x&&x<=n&&0<y&&y<=m&&0<z&&z<=p))
return true;
else return false;
}
struct ac{
int x,y,z;
};
int inq[maxn][maxn][maxn];
int sx,sy,sz,ex,ey,ez;
void SPFA(){
memset(inq,false,sizeof inq);
memset(d,0x3f,sizeof d);
queue<ac> Q;
Q.push((ac){sx,sy,sz});
inq[sx][sy][sz]=true;
d[sx][sy][sz]=0;
while(!Q.empty()){
ac u=Q.front();
Q.pop();
inq[u.x][u.y][u.z]=false;
for(int i=0;i<6;i++){
int vx=u.x+X[i],vy=u.y+Y[i],vz=u.z+Z[i];
if(check(vx,vy,vz)==false||g[vx][vy][vz]=='#') continue;
if(d[vx][vy][vz]>d[u.x][u.y][u.z]+1){
d[vx][vy][vz]=d[u.x][u.y][u.z]+1;
if(inq[vx][vy][vz]==false){
Q.push((ac){vx,vy,vz});
inq[vx][vy][vz]=true;
}
}
}
}
}
int main(){
while(~scanf("%d%d%d",&n,&m,&p)){
if(n==m&&m==p&&p==0) break;
for(int i=1;i<=n;++i){
for(int j=1;j<=m;++j){
cin>>(g[i][j]+1);
for(int k=1;k<=p;++k){
if(g[i][j][k]=='S'){
sx=i;sy=j;sz=k;
}
if(g[i][j][k]=='E'){
ex=i;ey=j;ez=k;
}
}
}
}
SPFA();
if(d[ex][ey][ez]!=inf)
cout<<"Escaped in "<<d[ex][ey][ez]<<" minute(s)."<<endl;
else
cout<<"Trapped!"<<endl;
}
return 0;
}