首页 > 代码库 > 广搜:codevs-3344(初步bfs)
广搜: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[100100],xz,yz,head,tail,n,m,flag; int u[10]={1,-1,0,0},p[10]={0,0,1,-1}; int a[8848],b[8848],x[30],y[30]; bool map1[510][510],map2[510][510]; void pro(int num){ while(pre[num]){ ++ans; num=pre[num]; } return ; } void doit(){ int i; do{ head++; for( i = 0 ; i < 4 ; ++i){ int xk=u[i]+a[head]; int yk=p[i]+b[head]; if(xk>=1&&xk<=n&&yk>=1&&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=1; pro(tail);head=tail; break; } } } }while(head<tail); } void start(){ int i,j; flag=0; head=0;tail=1; memset(pre,0,sizeof(pre)); memset(a,0,sizeof(a)); memset(b,0,sizeof(b)); memset(map2,true,sizeof(map2)); for(i = 1 ; i <= n ; ++i) for(j = 1 ; j <= m ; ++j) map2[i][j]=map1[i][j]; } int main(){ int j,sum=0; char s[100]; memset(map1,true,sizeof(map1)); scanf("%d%d",&n,&m); for(int i = 1 ; i <= n ; ++i){ scanf("%s",s); for( j = 1 ; j <= m ; ++j){ if(s[j-1]==‘2‘)map1[i][j]=false; if(s[j-1]>=65){ x[s[j-1]-64]=i; y[s[j-1]-64]=j; sum++; } } } for(int i = 1 ; i < sum ; ++i){ start(); xz=x[i+1];yz=y[i+1]; a[tail]=x[i];b[tail]=y[i];pre[tail]=0; map2[x[i]][y[i]]=false; doit(); if(!flag){ printf("Impossible\n"); return 0; } } start(); xz=x[1];yz=y[1]; a[tail]=x[sum];b[tail]=y[sum];pre[tail]=0; map2[x[sum]][y[sum]]=false; doit(); if(!flag){ printf("Impossible\n"); return 0; } printf("%d\n",ans); return 0; }
广搜:codevs-3344(初步bfs)
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。