#include<iostream>
#include <cstring>
#include<cstdio>
using namespace std;
int n;
int Sum = 0 ;
int ans = 0 ;
int dJx[4] = { -1 , 0 , 1 , 0 };
int dJy[4] = { 0 , 1 , 0 , -1 };
struct node {
int x;
int y;
int num;
};
node a[10002];
node b[10002];
char Map[102][102];
bool bo_F [102][102];
bool bo_J [102][102];
bool Check1 ( int x , int y ) {
return x>0 && x<=n && y>0 && y<=n ;
}
bool Check2(int i,int j) {
return ( a[i].x == b[j].x && ( a[i].y == b[j].y || a[i].y-1 == b[j].y || a[i].y+1 == b[j].y ) ) || ( a[i].y == b[j].y && ( a[i].x == b[j].x || a[i].x-1 == b[j].x || a[i].x+1 == b[j].x ) );
}
int main() {
freopen("maze.in","r",stdin);
freopen("maze.out","w",stdout);
int Fx,Fy,Jx,Jy;
memset ( bo_J , true , sizeof bo_J );
memset ( bo_F , true , sizeof bo_F );
cin >> n ;
for ( int i = 1 ; i <= n ; i ++ )
for ( int j = 1 ; j <= n ; j ++ ) {
cin >> Map[i][j];
if ( Map[i][j] == 'F' ) {
Fx = i ;
Fy = j ;
}
if ( Map[i][j] == 'J' ) {
Jx = i ;
Jy = j ;
}
if ( Map[i][j] != '*' ) Sum ++ ;
}
int qhead = 1 ;
int qtail = 1 ;
int s = 0 ;
int k = 0;
a[1].x = Jx;
a[1].y = Jy;
a[1].num = 1;
bo_J[Jx][Jy] = false ;
while ( qhead <= qtail && k <= Sum ) {
for ( int i = 0 ; i < 4 ; i ++ ) {
int d = ( i + s ) % 4 ;
int x = a[qhead].x + dJx[d] ;
int y = a[qhead].y + dJy[d] ;
if ( Map[x][y] != '*' && Check1( x ,y ) ) {
qtail ++ ;
a[qtail].x = x;
a[qtail].y = y;
a[qtail].num = a[qhead].num + 1 ;
s = ( i + s ) % 4 ;
k ++ ;
break;
}
}
qhead ++ ;
}
int len_J = qtail ;
qhead = 1 ;
qtail = 1 ;
b[1].x = Fx;
b[1].y = Fy;
b[1].num = 1;
bo_F[Fx][Fy] = false ;
while ( qhead <= qtail ) {
for ( int i = 0 ; i < 4 ; i++ ) {
int x = b[qhead].x + dJx[i] ;
int y = b[qhead].y + dJy[i] ;
if ( bo_F[x][y] && Map[x][y] != '*' && Check1 ( x , y ) ) {
bo_F[x][y] = false ;
qtail ++ ;
b[qtail].x = x;
b[qtail].y = y;
b[qtail].num = b[qhead].num + 1 ;
}
}
++qhead;
}
int len_F = qtail ;
/*
for (int i=1;i<=len_J;++i){
cout << a[i].num << ' ';
}
cout << endl;
for (int j=1;j<=len_F;++j){
cout << b[j].num << ' ';
}
cout << endl;
*/
for ( int i = 1 , j = 1 ; i <= len_J , j <= len_F ; ) {
while ( a[i].num != b[j].num ) {
if ( a[i].num > b[j].num )
j++;
else i++;
}
if (Check2(i,j)) {
cout << a[i].num - 1 << endl ;
return 0;
} else j ++ ;
}
cout << "No solution" << endl ;
return 0 ;
}
Maze
最新推荐文章于 2021-07-22 21:39:36 发布