靠墙走用 模拟,我写的是靠左走,因为靠右走相当于 靠左走从终点走到起点。
最短路径 用bfs。
#define _CRT_SECURE_NO_WARNINGS #include<stdio.h> #include<string.h> #include<math.h> #include<algorithm> #include<queue> using namespace std; #define MAXN 110 char map[MAXN][MAXN]; int n,m; int xx[4]={0,1,0,-1}; int yy[4]={1,0,-1,0}; struct tt { int x,y,step; }; int bfs(int x,int y,int x1,int y1) { int ans=0,i; tt front,rear,temp; queue<tt>q; while(!q.empty()) q.pop(); front.x=x,front.y=y,front.step=0; ans=1; q.push(front); i=0; while(!q.empty()) { temp=q.front(); if(temp.x==x1&&temp.y==y1)return ans; q.pop(); ans++; i=(i+3)%4; rear.x=temp.x+xx[i]; rear.y=temp.y+yy[i]; if(rear.x>=0&&rear.x<n&&rear.y>=0&&rear.y<m&&map[rear.x][rear.y]!=‘#‘) { q.push(rear); } else for(;;i=(i+1)%4) { rear.x=temp.x+xx[i]; rear.y=temp.y+yy[i]; if(rear.x>=0&&rear.x<n&&rear.y>=0&&rear.y<m&&map[rear.x][rear.y]!=‘#‘) { q.push(rear); break; } } } return ans; } int bfs1(int x,int y,int x1,int y1) { tt front,rear,temp; queue<tt>q; while(!q.empty()) q.pop(); front.x=x,front.y=y,front.step=1; q.push(front); map[x][y]=‘#‘; while(!q.empty()) { temp=q.front(); if(temp.x==x1&&temp.y==y1)return temp.step; q.pop(); for(int i=0;i<4;i++) { rear.x=temp.x+xx[i]; rear.y=temp.y+yy[i]; if(rear.x>=0&&rear.x<n&&rear.y>=0&&rear.y<m&&map[rear.x][rear.y]!=‘#‘) { rear.step=temp.step+1; q.push(rear); map[rear.x][rear.y]=‘#‘; } } } return 0; } int main() { int i,t,j,sx,sy,ex,ey,a,b,c; scanf("%d",&t); while(t--) { scanf("%d%d",&m,&n); for(i=0;i<n;i++) { scanf("%s",map[i]); for(j=0;j<m;j++) { if(map[i][j]==‘S‘) { sx=i;sy=j; } else if(map[i][j]==‘E‘) { ex=i;ey=j; } } } a=bfs(sx,sy,ex,ey); b=bfs(ex,ey,sx,sy); c=bfs1(sx,sy,ex,ey); printf("%d %d %d\n",a,b,c); } return 0; }
poj 3083 Children of the Candy Corn (广搜,模拟,简单)
原文:http://www.cnblogs.com/laiba2004/p/3550153.html