题意:
给你一个图,有起点st,终点end,可走点'.',不可走点‘#’;
让你分别求出,左转优先,右转优先的路径长度,和最短路径。
做法:
左转优先和右转优先是模拟走的过程。
最短路用的bfs。
注意:
1,图的点(x,y)和其对应的位置转化。
2,,左转优先走的顺序是:左,前,右,后;
3,注意边缘情况,判断点是否可达。
#include<iostream>
#include<stdio.h>
#include<string.h>
#include<queue>
using namespace std;
struct list
{int x;int y;int step;
}x;
int map[51][51];
int bian[2][4][2]={
{
{0,-1},{-1,0},{0,1},{1,0}},{
{0,1},{1,0},{0,-1},{-1,0}}};//左右转,方向,变化值,
int xxx[4]={0,1,0,-1};
int yyy[4]={-1,0,1,0};
int m,n;
int stx,sty,stleap;
int xx,yy,stt;
int search(int st,int end,int leap,int step)
{// printf("st=%d,end=%d,leap=%d,(%d,%d),stleap=%d\n",st,end,leap,stx,sty,stleap);int nowst;nowst=stx*m+sty;xx=stx;yy=sty;stt=stleap;step=1;while(nowst!=end){if(map[xx+bian[leap][stt][0]][yy+bian[leap][stt][1]]){// printf("1-----");xx=xx+bian[leap][stt][0];yy=yy+bian[leap][stt][1];if(leap==0)stt=((stt-1+4)%4);elsestt=(stt+1)%4;nowst=(xx-1)*m+yy;}else if(map[xx+(stt-1)%2][yy+(2-stt)%2]){// printf("2-----");yy=yy+(2-stt)%2;xx=xx+(stt-1)%2;nowst=(xx-1)*m+yy;}else if(map[xx-bian[leap][stt][0]][yy-bian[leap][stt][1]]){// printf("3-----");xx=xx-bian[leap][stt][0];yy=yy-bian[leap][stt][1];if(leap==0)stt=((stt+1+4)%4);elsestt=(stt-1+4)%4;nowst=(xx-1)*m+yy;}else{// printf("4-----");yy=yy-(2-stt)%2;xx=xx-(stt-1)%2;stt=(stt+2)%4;nowst=(xx-1)*m+yy;}step++;// printf("step%d=%d,%d,stt=%d\n",step,xx,yy,stt);// if(step>50)break;}return step;
}
int bfs(int st,int end)
{// printf("_________________bfs\n");int i;queue<struct list>q;int visit[101][101];memset(visit,0,sizeof(visit));struct list p;p.x=stx;p.y=sty;p.step=1;q.push(p);visit[stx][sty]=1;while(!q.empty()){x=q.front();// printf("%d,%d\n",x.x,x.y);q.pop();if((x.x-1)*m+x.y==end){return x.step;}for(i=0;i<4;i++){if(x.x+xxx[i]>0&&x.y+yyy[i]>0&&x.x+xxx[i]<=n&&x.y+yyy[i]<=m&&!visit[x.x+xxx[i]][x.y+yyy[i]]&&map[x.x+xxx[i]][x.y+yyy[i]]){visit[x.x+xxx[i]][x.y+yyy[i]]=1;p.x=x.x+xxx[i];p.y=x.y+yyy[i];p.step=x.step+1;q.push(p);// printf("push=(%d,%d)\n",p.x,p.y);// if(p.step>20)return 0;}}}return 0;}
int main()
{// freopen("in.txt","r",stdin);int t,i,j;char str;scanf("%d%*c",&t);while(t--){int st,end;scanf("%d %d%*c",&m,&n);for(i=1;i<=n;i++){for(j=1;j<=m;j++){scanf("%c",&str);if(str=='#')map[i][j]=0;else if(str=='.')map[i][j]=1;else if(str=='S'){map[i][j]=2,st=(i-1)*m+j;stx=i;sty=j;if(j==1)stleap=1;else if(i==1)stleap=2;else if(i==n)stleap=0;else if(j==n)stleap=3;}else if(str=='E')map[i][j]=3,end=(i-1)*m+j;}getchar();}// printf("(%d,%d),%d,%d\n",stx,sty,st,end);int x,y,z;x=search(st,end,0,1);y=search(st,end,1,1);z=bfs(st,end);printf("%d %d %d\n",x,y,z);}
}