The Monocycle,UVa 10047(状态记录广搜)

题目链接:http://acm.hust.edu.cn/vjudge/problem/36951

题意:

一辆独轮车,他的车轮每72度变一个颜色(蓝,白,绿,黑,红)。。每秒有3种操作,左转,右转,或者前进,前进的时候车轮的颜色会向前进一色.要求出到终点且车轮触底颜色为蓝色的最小时间。

初始时间为轮子触底为蓝,朝向北

源代码:

#include<iostream>
#include<cstdio>
#include<cstring>
#include<queue>
using namespace std;
char a[30][30];
int vis[30][30][4][5];
int n,m;
int dx[4]={-1,0,1,0};
int dy[4]={0,1,0,-1};
struct node{
    int x,y,di,co,t;
    node(int xx,int yy,int d,int c,int st)
    {
        x=xx;y=yy;di=d;co=c;t=st;
    }
};
queue<node> q;
void bfs()
{
    while(!q.empty())
    {
        node u=q.front();
        q.pop();
        if(a[u.x][u.y]=='T'&&u.co==0)
        {
            printf("minimum time = %d sec
",u.t);
            return;
        }
        int x=u.x,y=u.y,co=u.co;
        int di=(u.di+1)%4;//向右转
        if(!vis[x][y][di][co])
        {
            vis[x][y][di][co]=1;
            q.push(node(x,y,di,co,u.t+1));
        }
        di=(u.di+3)%4;//向左转
        if(!vis[x][y][di][co])
        {
            vis[x][y][di][co]=1;
            q.push(node(x,y,di,co,u.t+1));
        }
        di=u.di;//前进
        x+=dx[di];y+=dy[di];
        co=(co+1)%5;//下一种颜色
        if(x<n&&x>=0&&y<m&&y>=0&&a[x][y]!='#'&&!vis[x][y][di][co])
        {
            q.push(node(x,y,di,co,u.t+1));
            vis[x][y][di][co]=1;
        }
    }
    printf("destination not reachable
");
}
int main()
{
    int ss=1;
    while(scanf("%d%d",&n,&m)&&n&&m)
    {
        if(ss>1) printf("
");
        memset(vis,0,sizeof(vis));
        while(!q.empty()) q.pop();
        for(int i=0;i<n;i++)
            for(int j=0;j<m;j++)
            {
                cin>>a[i][j];
                if(a[i][j]=='S')
                {
                    q.push(node(i,j,0,0,0));
                    vis[i][j][0][0]=1;
                }
            }
        printf("Case #%d
",ss++);
        bfs();
    }
    return 0;
}
原文地址:https://www.cnblogs.com/q-c-y/p/5688903.html