标签:
Description
Input
Output
Sample Input
2 8 8 ######## #......# #.####.# #.####.# #.####.# #.####.# #...#..# #S#E#### 9 5 ######### #.#.#.#.# S.......E #.#.#.#.# #########
Sample Output
37 5 5 17 17 9
Description
Input
Output
Sample Input
2 8 8 ######## #......# #.####.# #.####.# #.####.# #.####.# #...#..# #S#E#### 9 5 ######### #.#.#.#.# S.......E #.#.#.#.# #########
Sample Output
37 5 5 17 17 9
/* 这题感开始我才用dfs做,但回溯不清楚,看了网上是用bfs,给我了想法 右:0 下:1 左:2 上:3 比如:计算向左转的时,此时方向是2,就应该这样循环1,2,3,0。 */ #include <iostream> #include<cstdio> #include<cstring> #include<queue> using namespace std; int t,n,m,sx,sy,tx,ty,dir,ans,ansleft,ansright; char mp[45][45]; struct node2 { int x,y; node2(int a,int b){x=a; y=b;} }; struct node { int x,y,d; node(int a,int b,int c){x=a; y=b; d=c;} }; int dr[4][2]={{0,1},{1,0},{0,-1},{-1,0}};//ср:0,об:1ё╛вС:2ё╛ио:3 void righthand(int k) { ansright=1; queue<node> Q; Q.push(node(sx,sy,k)); while(1) { node p=Q.front(); Q.pop(); if (p.x==tx && p.y==ty) return; p.d=(p.d+1)%4; for(int i=0;i<4;i++) { int xx=p.x+dr[(p.d-i+4)%4][0]; int yy=p.y+dr[(p.d-i+4)%4][1]; if(xx>=0 && xx<n && yy>=0 && yy<m && mp[xx][yy]!=‘#‘) { Q.push(node(xx,yy,(p.d-i+4)%4)); ansright++; break; } } } } void lefthand(int k) { ansleft=1; queue<node> Q; Q.push(node(sx,sy,k)); while(1) { node p=Q.front(); Q.pop(); if (p.x==tx && p.y==ty) return; p.d=(p.d-1+4)%4; for(int i=0;i<4;i++) { int xx=p.x+dr[(p.d+i)%4][0]; int yy=p.y+dr[(p.d+i)%4][1]; if(xx>=0 && xx<n && yy>=0 && yy<m && mp[xx][yy]!=‘#‘) { Q.push(node(xx,yy,(p.d+i)%4)); ansleft++; break; } } } } void bfs() { queue<node2> Q; int vis[45][45]; for(int i=0;i<n;i++) for(int j=0;j<m;j++) vis[i][j]=0; vis[sx][sy]=1; Q.push(node2(sx,sy)); while(!Q.empty()) { node2 p=Q.front(); Q.pop(); for(int i=0;i<4;i++) { int xx=p.x+dr[i][0]; int yy=p.y+dr[i][1]; if (xx<0 || yy<0 || xx>=n || yy>=m || mp[xx][yy]==‘#‘) continue; if (vis[xx][yy]>0) continue; vis[xx][yy]=vis[p.x][p.y]+1; Q.push(node2(xx,yy)); if (xx==tx && yy==ty) {ans=vis[xx][yy];return;} } } ans=vis[tx][ty]; return; } int main() { scanf("%d",&t); for(;t>0;t--) { scanf("%d%d",&m,&n); for(int i=0;i<n;i++) { scanf("%s",&mp[i]); for(int j=0;j<m;j++) if (mp[i][j]==‘S‘) sx=i,sy=j; else if (mp[i][j]==‘E‘) tx=i,ty=j; } if (sx==0) dir=1; else if (sx==n-1) dir=3; else if (sy==0) dir=0; else if (sy==m-1) dir=2; bfs(); //printf("%d\n",ans); righthand(dir); //printf("%d\n",ansright); lefthand(dir); //printf("%d\n",ansleft); printf("%d %d %d\n",ansleft,ansright,ans); } return 0; }
POJ 3083 Children of the Candy Corn
标签:
原文地址:http://www.cnblogs.com/stepping/p/5815037.html