hdoj 詭異的樓梯 1180 (bfs&&奇偶判斷) 好題
阿新 • • 發佈:2019-01-24
#include<stdio.h> #include<string.h> #include<algorithm> #include<queue> #define INF 0x3f3f3f3f using namespace std; char a[22][22]; int b[22][22]; int dx[4]={1,-1,0,0}; int dy[4]={0,0,1,-1}; int n,m; struct zz { int x; int y; int l; }f1,f2; bool judge(zz p) { if(p.x<0||p.x>=n||p.y<0||p.y>=m||a[p.x][p.y]=='*'||b[p.x][p.y]) return false; return true; } void bfs(int x,int y) { memset(b,0,sizeof(b)); queue<zz>q; f1.x=x;f1.y=y;f1.l=0; q.push(f1); b[x][y]=1; while(!q.empty()) { f1=q.front(); q.pop(); if(a[f1.x][f1.y]=='T') { printf("%d\n",f1.l); return ; } for(int i=0;i<4;i++) { f2.x=f1.x+dx[i]; f2.y=f1.y+dy[i]; f2.l=f1.l+1; if(!judge(f2)) continue; if(a[f2.x][f2.y]=='.'||a[f2.x][f2.y]=='T') { b[f2.x][f2.y]=1; q.push(f2); } else if((a[f2.x][f2.y]=='|'&&!(f1.l&1))||(a[f2.x][f2.y]=='-'&&(f1.l&1)))//表橫著走 { if(i>1) { f2=f1; f2.l++; q.push(f2); continue; } f2.x+=dx[i]; if(!judge(f2)) continue; b[f2.x][f2.y]=1; q.push(f2); } else//表豎著走 { if(i<2) { f2=f1; f2.l++; q.push(f2); continue; } f2.y+=dy[i]; if(!judge(f2)) continue; b[f2.x][f2.y]=1; q.push(f2); } } } } int main() { int i,j; int sx,sy; while(scanf("%d%d",&n,&m)!=EOF) { for(i=0;i<n;i++) scanf("%s",a[i]); for(i=0;i<n;i++) { for(j=0;j<m;j++) { if(a[i][j]=='S') { sx=i;sy=j; } } } bfs(sx,sy); } return 0; }