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\n",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\n");
}
int main()
{
    int ss=1;
    while(scanf("%d%d",&n,&m)&&n&&m)
    {
        if(ss>1) printf("\n");
        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\n",ss++);
        bfs();
    }
    return 0;
}
时间: 2024-11-07 19:51:26

The Monocycle,UVa 10047(状态记录广搜)的相关文章

POJ 1753 Flip game状态压缩+广搜

题意有4*4的16个方格,每个方格有黑白两种颜色,每次点击方格后,被点击方格本身及其上下左右的方格都会改变颜色.给出一组状态,求将这组状态变为全白或者全黑至少需要点击几次.若无法达到,则输出Impossible. 样例输入bwwbbbwbbwwbbwww 样例输出4 思路每个方格只有黑白两种颜色,且只有16个方格,因此可以把每个状态看作一个16位的二进制数(状态压缩),2^16=25536,因此可以用int来保存状态.然后就是BFS暴搜,直到状态为0或者65535(全1)为止. 注意点65535

The Monocycle UVA 10047

说说: 这算是一道比较难的题目了,拖到今天终于搞定啦!题意是这样的,有如下这样一个棋盘:一个轮子从S出发开始运动,它有三个选择,沿原方向向前滚一格,或者在原地向左或向右转90度,并且无论是滚动还是转身都将耗时一秒.其中轮子由五种颜色组成,每滚动一个,与地面接触的颜色都将变换一次,如下图所示.假设开始的时候轮子停在S初,方向朝北,颜色为绿色,则能否到达目的地T,且颜色仍旧为绿色,求最短时间. 分析:开始的时候想法非常简单,就是DFS嘛,看能不能到达T,到时候再看看颜色的状态都差不多了.其实这是不对

hdu 2209 状态压缩广搜

思路:    20张牌     有1>>20中情况        用二进制标记,  这道题的关键地方就是怎样无翻牌     这里用到位运算   1^x    若x为0  则为1   否则为0  这里正好用到翻牌     对前两张和后两张  都可以和3(11)进行异或运算     对中间的和7(111) 进行异或运算 #include<stdio.h> #include<queue> #include<string.h> #include<iostrea

深搜和广搜的原理及优缺点

原文来源:https://blog.csdn.net/dark_cy/article/details/88926435 深搜原理深搜,顾名思义,是深入其中.直取结果的一种搜索方法. 如果深搜是一个人,那么他的性格一定倔得像头牛!他从一点出发去旅游,只朝着一个方向走,除非路断了,他绝不改变方向!除非四个方向全都不通或遇到终点,他绝不后退一步!因此,他的姐姐广搜总是嘲笑他,说他是个一根筋.不撞南墙不回头的家伙. 深搜很讨厌他姐姐的嘲笑,但又不想跟自己的亲姐姐闹矛盾,于是他决定给姐姐讲述自己旅途中的经

uva 10047 uva live 2035 The Monocycle bfs

// uva 10047 uva live 2035 bfs // 求最短的嘛,肯定先尝试bfs啦 // 确定状态,首先状态里面得有坐标x,y // 还得有朝向,还得有颜色值 // // 这样就是一个状态里面有着三种属性 // 每个状态都只要经历一次,再经历是没有任何意义的 // 用一个que的思维数组记录就行了. // 按照方向爆搜,我先用f[i][j]记录的就是到 // 这一点的最小距离,但是怎么都过不了样例 // 突然明白了,如果只是这样记录最短距离,是不行的 // 因为每次从队列中取出的

poj 1166 The Clocks 记录路径的广搜

题意: 给9个时钟的初始状态,和一些对某几个钟的操作,求最少经过几步能到目标状态(全指向12点). 分析: 明显的广搜,但实现起来的细节要注意:1.因为要记录路径,所以要在整个程序执行过程中扩展出的节点在输出路径前不能销毁, 故采用静态内存分配的方法(开node[600000],用get_node()创建节点.2.queue<node>比queue<int>要多花1别的时间. //poj 1166 //sep9 #include <iostream> #include

UVA 10047 - The Monocycle

题目如下:  Problem A: The Monocycle  A monocycle is a cycle that runs on one wheel and the one we will be considering is a bit more special. It has a solid wheel colored with five differentcolors as shown in the figure: The colored segments make equal an

nyist 999 师傅又被妖怪抓走了 【双广搜 || BFS +状态压缩】

题目:nyist 999 师傅又被妖怪抓走了 分析:在一个图中只要看到D点和E点就行的最小步数,看到的定义是:也就是说两个人在同一行或者同一列,并且中间没有障碍物或者没有其他人就可以看到对方. 所以可以先预处理地图,把D点和E点所在的行列的' .'扩展为d和e,然后只要搜到d和e就可以,问题是只有d和e同时搜到才行,直接广搜肯定不行,我们可以在搜到d点之后然后在从当前点广搜e点,或者e点广搜d点,这样第一次搜到的点不一定是最优的,所以需要枚举所有情况才行,时间复杂度较高. 比较好的一种方法是BF

魔板 Magic Squares(广搜,状态转化)

题目背景 在成功地发明了魔方之后,鲁比克先生发明了它的二维版本,称作魔板.这是一张有8个大小相同的格子的魔板: 1 2 3 4 8 7 6 5 题目描述 我们知道魔板的每一个方格都有一种颜色.这8种颜色用前8个正整数来表示.可以用颜色的序列来表示一种魔板状态,规定从魔板的左上角开始,沿顺时针方向依次取出整数,构成一个颜色序列.对于上图的魔板状态,我们用序列(1,2,3,4,5,6,7,8)来表示.这是基本状态. 这里提供三种基本操作,分别用大写字母“A”,“B”,“C”来表示(可以通过这些操作改