您的位置:首页 > 其它

Maze

2016-02-15 19:35 190 查看
#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 ;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: