Maze

本文介绍了一种基于双向搜索的迷宫求解算法,通过记录火源(F)和人物(J)的位置并使用队列进行扩展搜索,实现了在复杂的迷宫环境中寻找从人物位置到火源最短路径的功能。算法首先通过人物的移动确定可达范围,然后从火源出发逆向搜索,最终找到交汇点以确定最短路径。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

#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 ;

}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值