逃离迷宫 bfs

3
5 5
....P
##..E
K#...
##...
.....
5 5
P....
.....
..E..
.....
....K
5 5
P#..E
.#.#.
.#.#.
.#.#.
...#K

No solution
12
No solution

Code:
/*#include <bits/stdc++.h>
using namespace std;
const int AX = 5e2+66;
struct Node{
int x,y,k;
};
int dir[4][2] = {
{1,0},
{0,1},
{-1,0},
{0,-1}
};
char G[AX][AX];
int n , m ;
int vis[AX][AX][2];

int bfs( int x, int y ){
memset( vis , -1 , sizeof(vis) );
queue<Node>que;
Node tmp ;
tmp.x = x ;
tmp.y = y ;
tmp.k = 0;
vis[x][y][tmp.k] = 0;
que.push(tmp);
while( !que.empty() ){
Node q = que.front();
que.pop();
if( G[q.x][q.y] == 'E' && q.k ) return vis[q.x][q.y][1];
for( int i = 0 ; i < 4 ; i++ ){
int xx = q.x + dir[i][0];
int yy = q.y + dir[i][1];
if( xx >= 0 && xx < n && yy >= 0 && yy < m && G[xx][yy] != '#' ){
Node tp ;
if( G[xx][yy] == 'K' ) tp.k = 1;
else tp.k = q.k;
if( vis[xx][yy][tp.k] != -1 ) continue;
if( G[xx][yy] == 'E' && !tp.k ) continue;
tp.x = xx;
tp.y = yy;
vis[tp.x][tp.y][tp.k] = vis[q.x][q.y][q.k] + 1;
que.push(tp);
}
}

}
return -1;
}

int main(){
int T;
scanf("%d",&T);
while( T-- ){
int sx,sy;
scanf("%d%d",&n,&m);
for( int i = 0 ; i < n ; i++ ){
scanf("%s",G[i]);
}
for( int i = 0 ; i < n ; i ++ ){
for( int j = 0 ; j < m ; j++ ){
if( G[i][j] == 'P' ){
sx = i;
sy = j;
break;
}
}
}
int res = bfs(sx,sy);
if( res != -1 ){
cout << res << endl;
}else{
cout << "No solution" << endl;
}
}
return 0 ;
}*/

#include <bits/stdc++.h>
using namespace std;
const int AX = 5e2+66;
struct Node{
int x,y,step,k;
};
int dir[4][2] = {
{1,0},
{0,1},
{-1,0},
{0,-1}
};
char G[AX][AX];
int n , m ;
int vis[AX][AX][2];

int bfs( int x, int y ){
memset( vis , 0 , sizeof(vis) );
queue<Node>que;
Node tmp ;
tmp.x = x ;
tmp.y = y ;
tmp.k = 0;
tmp.step = 0;
vis[x][y][tmp.k] = 1;
que.push(tmp);
while( !que.empty() ){
Node q = que.front();
que.pop();
if( G[q.x][q.y] == 'E') return q.step;
for( int i = 0 ; i < 4 ; i++ ){
int xx = q.x + dir[i][0];
int yy = q.y + dir[i][1];
if( xx >= 0 && xx < n && yy >= 0 && yy < m && G[xx][yy] != '#' ){
Node tp;
if( G[xx][yy] == 'K' ){
tp.k = 1;
}else tp.k = q.k;
if( vis[xx][yy][tp.k] ) continue;
vis[xx][yy][tp.k] = 1;
if( G[xx][yy] == 'E' && !vis[xx][yy][1] ) continue;
tp.x = xx;
tp.y = yy;
tp.step = q.step + 1 ;
que.push(tp);
}
}
}
return -1;
}

int main(){
int T;
scanf("%d",&T);
while( T-- ){
int sx,sy;
scanf("%d%d",&n,&m);
for( int i = 0 ; i < n ; i++ ){
scanf("%s",G[i]);
}
for( int i = 0 ; i < n ; i ++ ){
for( int j = 0 ; j < m ; j++ ){
if( G[i][j] == 'P' ){
sx = i;
sy = j;
break;
}
}
}
int res = bfs(sx,sy);
if( res != -1 ){
cout << res << endl;
}else{
cout << "No solution" << endl;
}
}
return 0 ;
}

• 广告
• 抄袭
• 版权
• 政治
• 色情
• 无意义
• 其他

120