POJ2225+BFS

时间:2023-03-08 23:27:18
POJ2225+BFS

简单的BFS   1a

 /*
从起点到终点
*/
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<algorithm>
#include<queue>
#include<iostream>
using namespace std; const int maxn = ;
const int Max = ;
char mat[ maxn ][ maxn ][ maxn ];
int vis[ maxn ][ maxn ][ maxn ];
const int dx[]={,,,-,,};
const int dy[]={,-,,,,};
const int dz[]={,,,,,-};
struct node{
int x,y,z,ti;
}my_start,my_end; bool ok( node cur ){
if( mat[ cur.z ][ cur.x ][ cur.y ]=='X'||vis[ cur.z ][ cur.x ][ cur.y ]== )
return false;
else
return true;
} bool inside( node cur,int n ){
if( cur.x>=&&cur.x<n&&cur.y>=&&cur.y<n&&cur.z>=&&cur.z<n )
return true;
else
return false;
} int bfs( int n ){
if( my_start.x==my_end.x&&my_start.y==my_end.y&&my_start.z==my_end.z )
return ;
queue<node>q;
node cur,nxt;
int ans = Max;
cur.x = my_start.x;
cur.y = my_start.y;
cur.z = my_start.z;
cur.ti = ;
vis[ cur.z ][ cur.x ][ cur.y ] = ;
q.push( cur );
while( !q.empty() ){
cur = q.front();
q.pop();
if( cur.x==my_end.x&&cur.y==my_end.y&&cur.z==my_end.z ){
ans = min( ans,cur.ti );
}
for( int i=;i<;i++ ){
nxt = cur;
nxt.ti ++;
nxt.x += dx[i];
nxt.y += dy[i];
nxt.z += dz[i];
if( inside( nxt,n )==false||ok( nxt )==false ) continue;
vis[ nxt.z ][ nxt.x ][ nxt.y ] = ;
q.push( nxt );
}
} if( ans>=Max ) return -;
else return ans;
} int main(){
int N;
char str[ maxn ];
while( scanf("%s%d",str,&N)!=EOF ){
memset( vis,,sizeof( vis ) );
for( int i=;i<N;i++ ){
for( int j=;j<N;j++ ){
scanf("%s",mat[ i ][ j ]);
}
}
//mat[i][j][k] 层 行 列
scanf("%d%d%d",&my_start.y,&my_start.x,&my_start.z);
scanf("%d%d%d",&my_end.y,&my_end.x,&my_end.z);
//列 行 层
scanf("%s",str);
int ans = bfs( N );
if( ans==- ) printf("NO ROUTE\n");
else printf("%d %d\n",N,ans);
}
return ;
}