POJ 3083 Children of the Candy Corn
阿新 • • 發佈:2019-01-06
如下程式碼:
#include<cstdio> #include<cstring> #include<algorithm> #include<iostream> #include<queue> #define MAXN 110 #define N 21 int dx[4]={0,-1,0,1}; int dy[4]={-1,0,1,0}; int dl[4][2]={{0,-1},{-1,0},{0,1},{1,0}}; int dr[4][2]={{0,1},{-1,0,},{0,-1},{1,0}}; int sx,sy,ex,ey,n,m; char G[MAXN][MAXN]; using namespace std; struct Node { int x,y,s; }; int DFS(int x,int y,int d,int step,int dir[][2]) { for(int i=0;i<=3;i++) { int j=((d-1+4)%4+i)%4; int nx=x+dir[j][0]; int ny=y+dir[j][1]; if(nx==ex&&ny==ey) return step+1; if(nx<0||ny<0||nx>=n||ny>=m) continue; if(G[nx][ny]=='#') continue; return DFS(nx,ny,j,step+1,dir); } } int BFS(int sx,int sy) { bool v[MAXN][MAXN]; memset(v,false,sizeof(v)); queue<Node>Q; Node p; p.x=sx; p.y=sy; p.s=1; Q.push(p); v[sx][sy]=true; while(!Q.empty()) { Node p=Q.front(); Q.pop(); if(p.x==ex&&p.y==ey) return p.s; Node np; for(int d=0;d<=3;d++) { np.x=p.x+dx[d]; np.y=p.y+dy[d]; np.s=p.s+1; if(np.x<0||np.y<0||np.x>=n||np.y>=m) continue; if(v[np.x][np.y]) continue; if(G[np.x][np.y]!='#') { v[np.x][np.y]=true; Q.push(np); } } } return -1; } int main() { int T,d1,d2; scanf("%d",&T); while(scanf("%d%d",&m,&n)!=EOF) { for(int i=0;i<n;i++) { scanf("%s",G[i]); for(int j=0;j<m;j++) { if(G[i][j]=='S') { sx=i; sy=j; } else if(G[i][j]=='E') { ex=i; ey=j; } } } if(sx==0) { d1=3,d2=3; } else if(sx==n-1) { d1=1; d2=1; } else if(sy==0) { d1=2; d2=0; } else if(sy==m-1) { d1=0; d2=2; } cout<<DFS(sx,sy,d1,1,dl)<<' '<<DFS(sx,sy,d2,1,dr)<<' '<<BFS(sx,sy)<<endl; } //while(1); return 0; }