廣搜:codevs-3344(初步bfs)
阿新 • • 發佈:2017-05-19
def miss bool ret map efault 變量 -a print
一道典型的迷宮問題
小剛在迷宮內,他需要從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)