UVA 10047 The Monocycle (bfs)

点击打开链接

题目大意:有一个独轮车,他可以向左转,向右转,直走,向左转和向右转都只改变方向,直走会改变车轮的颜色,问最后能不能从S点走到T点。如果能,求出最小时间

把坐标,方向,颜色作为状态,然后进行bfs即可

#include<iostream>
#include<cstring>
#include<cstdio>
#include<queue>
using namespace std;
const int maxn=30;
struct Node
{
	int x;
	int y;
	int col;
	int dir;
	int time;
};
int n,m;
char map[maxn][maxn];
bool vis[maxn][maxn][maxn][maxn];
//north west south east
int dirx[]={-1,0,1,0};
int diry[]={0,-1,0,1};
Node start;
int bfs()
{
	memset(vis,false,sizeof(vis));
	queue<Node> que;
	que.push(start);
	vis[start.x][start.y][start.dir][start.col]=true;
	while(!que.empty())
	{
		Node now=que.front();
		que.pop();
		if(map[now.x][now.y]=='T'&&now.col==0)
		{
			return now.time;
		}
		else
		{
			//turn right
			Node tmp=now;
			tmp.dir=(now.dir+3)%4;
			tmp.time+=1;
			if(!vis[tmp.x][tmp.y][tmp.dir][tmp.col])
			{
				vis[tmp.x][tmp.y][tmp.dir][tmp.col]=true;
				que.push(tmp);
			}
			//turn left
			tmp=now;
			tmp.dir=(now.dir+1)%4;
			tmp.time+=1;
			if(!vis[tmp.x][tmp.y][tmp.dir][tmp.col])
			{
				vis[tmp.x][tmp.y][tmp.dir][tmp.col]=true;
				que.push(tmp);
			}
			//stand still
			tmp=now;
			tmp.x=now.x+dirx[tmp.dir];
			tmp.y=now.y+diry[tmp.dir];
			tmp.time+=1;
			tmp.col=(now.col+1)%5;
			
			if(tmp.x<0||tmp.x>=n||tmp.y<0||tmp.y>=m) continue;
			if(!vis[tmp.x][tmp.y][tmp.dir][tmp.col]&&map[tmp.x][tmp.y]!='#')
			{
				vis[tmp.x][tmp.y][tmp.dir][tmp.col]=true;
				que.push(tmp);
			}
		}
	}
	return -1;
}
int main()
{
	int cas=1;
	while(~scanf("%d%d",&n,&m))
	{
		if(!n&&!m) break;
		if(cas>1) puts("");
		getchar();
		for(int i=0;i<n;i++)
		{
			scanf("%s",map[i]);
			for(int j=0;j<m;j++)
			{
				if(map[i][j]=='S')
				{
					start.x=i;
					start.y=j;
					start.dir=0;
					start.col=0;
					start.time=0;
				}
			}
		}
		int ans=bfs();
		printf("Case #%d\n",cas++);
		if(ans==-1)
		{
			puts("destination not reachable");
		}
		else
		{
			printf("minimum time = %d sec\n",ans);
		}
	}
	return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_37943488/article/details/80914784
今日推荐