题目大意:有一个独轮车,他可以向左转,向右转,直走,向左转和向右转都只改变方向,直走会改变车轮的颜色,问最后能不能从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;
}