hdu 3137 No Left Turns bfs

来源:互联网 发布:百度云盘显示网络异常 编辑:程序博客网 时间:2024/06/01 12:16

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3137

题意:除起点可以从四个方向走之外,其余点只能往前往右走,求最小距离

#include<cstdio>#include<iostream>#include<cstring>#include<queue>using namespace std;const int maxn = 25;char map[maxn][maxn],vis[4][maxn][maxn];int si,sj,step,n,m;struct node{int i,j,dir;node(int i,int j,int dir){this->i=i;this->j=j;this->dir=dir;};};queue<node> q;void bfs(int i,int j,int ei,int ej){int dir;for(int k=0;k<4;k++){q.push(node(i,j,k));vis[k][i][j]=1;}while(!q.empty()){int sz=q.size();while(sz--){node a=q.front();q.pop();int de=a.dir;int dx=a.i,dy=a.j;if(dx==ei&&dy==ej){return;}//forwardif(de==0)//向上dx--;else if(de==1)//向下 dx++;else if(de==2)//向左 dy--;else if(de==3) //向右 dy++;if(!vis[de][dx][dy]&&map[dx][dy]!='X'){q.push(node(dx,dy,de));vis[de][dx][dy]=1;}//rightdx=a.i,dy=a.j;if(de==0){dy++;de=3;}else if(de==1){dy--;de=2;}else if(de==2){dx--;de=0;}else if(de==3){dx++;de=1;}if(!vis[de][dx][dy]&&map[dx][dy]!='X'){q.push(node(dx,dy,de));vis[de][dx][dy]=1;}}step++;}}int main(){int T;scanf("%d",&T);while(T--){int ei,ej;step=0;while(!q.empty())q.pop();memset(vis,0,sizeof(vis));scanf("%d%d",&n,&m);getchar();for(int i=0;i<n;i++){for(int j=0;j<m;j++){scanf("%c",&map[i][j]);if(map[i][j]=='S')si=i,sj=j;if(map[i][j]=='F')ei=i,ej=j;}getchar();}bfs(si,sj,ei,ej);printf("%d\n",step);}} 

0 0
原创粉丝点击