题目大意:
求独轮车到达指定点的最短时间花费。步数应为5 的倍数。
visit 仅仅表示到没到过? 应该是用来表示
某个状态是否出现过,用四维数组表示,时间也一样。
对于t的理解无论 前进还是左右转,时间都应该只加1;
方 向: 0
1 3
2
transfer 边界检查,答案更新
// UVa10047 The Monocycle
// Zhizhao Zhuo
#include<iostream>
#include<cstdio>
#include<cstring>
#include<queue>
using namespace std;
const int INF=1000000000 +10;
const int maxn=30;
char grid[maxn][maxn];
int vis[maxn][maxn][4][5];
int t[maxn][maxn][4][5];
int sx,sy,ex,ey;
int xx[4]={-1,0,1,0};
int yy[4]={0,-1,0,1};
int M,N,ans;
struct node{
int x,y,dir,col;
node(int x,int y,int dir,int col):x(x),y(y),dir(dir),col(col){}
};
queue<node>Q;
void transfer(int x,int y,int dir,int col,int v){
if(x<0||y<0||x>=M||y>=N)return;
if(grid[x][y]=='#' || vis[x][y][dir][col]==1)return;
vis[x][y][dir][col]=1;
t[x][y][dir][col]=v;
Q.push(node(x,y,dir,col));
if(x==ex&&y==ey&&col==0)ans=min(ans,v);
}
void bfs(){
memset(vis,0,sizeof(vis));
memset(t,0,sizeof(t));
Q.push(node(sx,sy,0,0));
vis[sx][sy][0][0]=1;
while(!Q.empty()){
node temp=Q.front();Q.pop();
int v=t[temp.x][temp.y][temp.dir][temp.col]+1;
transfer(temp.x,temp.y,(temp.dir+1)%4,temp.col,v);//左
transfer(temp.x,temp.y,(temp.dir+3)%4,temp.col,v);//右
transfer(temp.x+xx[temp.dir],temp.y+yy[temp.dir],temp.dir,(temp.col+1)%5,v);//前
}
}
int main(){
int sum=0;
while(scanf("%d%d",&M,&N)==2&&M){
for(int i=0;i<M;i++){
scanf("%s",grid[i]);
for(int j=0;j<N;j++){
if(grid[i][j]=='S'){sx=i;sy=j;}
else if(grid[i][j]=='T'){ex=i;ey=j;}
}
}
ans=INF;
if(sum)printf("\n");
printf("Case #%d\n",++sum);
bfs();
if(ans==INF)printf("destination not reachable\n");
else printf("minimum time = %d sec\n",ans);
}
return 0;
}