广搜:codevs-3344(初步bfs)

时间:2023-03-09 17:00:53
广搜:codevs-3344(初步bfs)

                一道典型的迷宫问题

小刚在迷宫内,他需要从A点出发,按顺序经过B,C,D……,到达最后一个点,再回到A点。迷宫内有些障碍,问至少走几步。

输入描述 Input Description

第一行有三个数n,m表示迷宫有n行,m列。

第2行到第n+1行,每行m个字符,可能是’A’..’Z’,’2’,’0’ 其中,2表示障碍,0表示可以走。’A’..’Z’也可以走。

输出描述 Output Description

至少走几步可以按规定走完,如果不行,输出“Impossible”

读完题后发现这道题比较吸引人的一点是在同一组数据中需要进行多次bfs,很有趣。

比较坑的地方在于,每一次需要判断是否能到达下一点,如果其中一个点到不了,那么便mission fail~

那么没什么问题啦,贴代码:

(写这道题的时候有点着急,以至于变量使用的有点乱QAQ)

#include<bits/stdc++.h>
using namespace std;
int ans,pre[],xz,yz,head,tail,n,m,flag;
int u[]={,-,,},p[]={,,,-};
int a[],b[],x[],y[];
bool map1[][],map2[][];
void pro(int num){
while(pre[num]){
++ans;
num=pre[num];
}
return ;
}
void doit(){
int i;
do{
head++;
for( i = ; i < ; ++i){
int xk=u[i]+a[head];
int yk=p[i]+b[head];
if(xk>=&&xk<=n&&yk>=&&yk<=m&&map2[xk][yk]){
tail++;
a[tail]=xk;b[tail]=yk;pre[tail]=head;
map2[xk][yk]=false;
if(xk==xz&&yk==yz){
flag=;
pro(tail);head=tail;
break;
}
}
}
}while(head<tail);
}
void start(){
int i,j;
flag=;
head=;tail=;
memset(pre,,sizeof(pre));
memset(a,,sizeof(a));
memset(b,,sizeof(b));
memset(map2,true,sizeof(map2));
for(i = ; i <= n ; ++i)
for(j = ; j <= m ; ++j)
map2[i][j]=map1[i][j]; }
int main(){
int j,sum=;
char s[];
memset(map1,true,sizeof(map1));
scanf("%d%d",&n,&m);
for(int i = ; i <= n ; ++i){
scanf("%s",s);
for( j = ; j <= m ; ++j){
if(s[j-]=='')map1[i][j]=false;
if(s[j-]>=){
x[s[j-]-]=i;
y[s[j-]-]=j;
sum++;
}
}
}
for(int i = ; i < sum ; ++i){
start();
xz=x[i+];yz=y[i+];
a[tail]=x[i];b[tail]=y[i];pre[tail]=;
map2[x[i]][y[i]]=false;
doit();
if(!flag){
printf("Impossible\n");
return ;
}
}
start();
xz=x[];yz=y[];
a[tail]=x[sum];b[tail]=y[sum];pre[tail]=;
map2[x[sum]][y[sum]]=false;
doit();
if(!flag){
printf("Impossible\n");
return ;
}
printf("%d\n",ans);
return ;
}