UVA 10047 Monocycle

题目大意:
求独轮车到达指定点的最短时间花费。步数应为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;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值