HDU 5012 骰子旋转(DFS)

http://acm.hdu.edu.cn/showproblem.php?pid=5012

保存骰子的状态,然后用dfs或者bfs搜索

还是再讲一下dfs

我们的目标是找一个与b相同,且转次数最少的状态

dfs就是树状图,要明确每个状态下的分支,以及边界条件

有4种变换,所以每个状态下面有四种分支,又因为骰子转4次以上的状态没有意义,所以边界条件可以是4

每个状态起始时与b判断,如果相同,则更新结果

#include <iostream>
#include <string>
#include <cstring>
#include <cstdlib>
#include <cstdio>
#include <cmath>
#include <algorithm>
#include <stack>
#include <queue>
#include <cctype>
#include <vector>
#include <iterator>
#include <set>
#include <map>
#include <sstream>
using namespace std;

#define mem(a,b) memset(a,b,sizeof(a))
#define pf printf
#define sf scanf
#define spf sprintf
#define pb push_back
#define debug printf("!\n")
#define MAXN 100000 + 10
#define MAX(a,b) a>b?a:b
#define blank pf("\n")
#define LL long long
#define ALL(x) x.begin(),x.end()
#define INS(x) inserter(x,x.begin())
#define pqueue priority_queue
#define INF 0x3f3f3f3f

int n,m;

int result;

int a[6],b[6];

int dice[5][6]
{
    {0,1,2,3,4,5},
    {3,2,0,1,4,5},
    {2,3,1,0,4,5},
    {5,4,2,3,0,1},
    {4,5,2,3,1,0}
};

void dfs(int cnt)
{
    if(cnt>=5) return;
    int i,j,flag = 1;
    for(i=0;i<6;i++)
    {
        if(a[i]!=b[i])
        {
            flag = 0;
            break;
        }
    }

    if(flag)
    {
        result = min(result,cnt);
        return;
    }
    //pf("cnt%d\n",cnt);
    int ans = -1,tmp[6];
    for(i=0;i<6;i++) tmp[i] = a[i];

    for(i=1;i<5;i++)
    {
        for(j=0;j<6;j++)
        {
            a[j] = tmp[dice[i][j]];
            //pf("%d ",a[j]);
        }
        //blank;
        dfs(cnt+1);
    }
    for(i=0;i<6;i++) a[i] = tmp[i];
    return;
}

int main()
{
    int i,j;
    while(sf("%d",&a[0])!=EOF)
    {
        result = 5;
        for(i=1;i<6;i++) sf("%d",&a[i]);
        for(i=0;i<6;i++) sf("%d",&b[i]);
        dfs(0);
        if(result == 5) result = -1;
        pf("%d\n",result);
    }
    return 0;
}

这题用bfs其实更合适

时间: 2025-01-07 08:52:49

HDU 5012 骰子旋转(DFS)的相关文章

hdu 1501 Zipper (dfs+记忆化搜索)

Zipper Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 6491    Accepted Submission(s): 2341 Problem Description Given three strings, you are to determine whether the third string can be formed

hdu 1518 Square (dfs搜索可参考poj1011)

Square Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 8589    Accepted Submission(s): 2784 Problem Description Given a set of sticks of various lengths, is it possible to join them end-to-end

HDU 5012 Dice DFS

简单DFS 1 //#pragma comment(linker, "/STACK:16777216") //for c++ Compiler 2 #include <stdio.h> 3 #include <iostream> 4 #include <cstring> 5 #include <cmath> 6 #include <stack> 7 #include <queue> 8 #include <v

hdu 5012 bfs --- 慎用STL 比如MAP判重

http://acm.hdu.edu.cn/showproblem.php?pid=5012 发现一个问题 如果Sting s = '1'+'2'+'3'; s!="123"!!!!!!  而是有乱码 先贴一份自己的TLE 代码, 超时应该是因为: 1.cin 2.map判重 map find太花时间 3.string花时间 4.其实不用两个都旋转,只要旋转一个就行,这样可以省下很多时间 包括少用了make_pair pair的判重等等....哎  二笔了  太暴力了 #include

hdu 5167 Fibonacci(DFS)

hdu 5167 Fibonacci 问题描述 斐波那契数列的递归定义如下: Fi=???01Fi?1+Fi?2i = 0i = 1i > 1 现在我们需要判断一个数是否能表示为斐波那契数列中的数的乘积. 输入描述 有多组数据,第一行为数据组数T(T≤100,000). 对于每组数据有一个整数n,表示要判断的数字. 0≤n≤1,000,000,000 输出描述 对于每组数据,如果可以输出"Yes",否则输出"No". 输入样例 3 4 17 233 输出样例

HDU 3158 PropBot(DFS)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3158 Problem Description You have been selected to write the navigation module for PropBot. Unfortunately, the mechanical engineers have not provided a lot of flexibility in movement; indeed, the PropBot

HDU 5012 Dice (BFS)

其实是很水的一道bfs,用字符串表示每个状态,map判重就ok了. 题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5012 #include<iostream> #include<cstdio> #include<cstring> #include<cmath> #include<cctype> #include<algorithm> #include<string> #in

hdu 4499 Cannon 暴力dfs搜索

Cannon Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65535/65535 K (Java/Others) Total Submission(s): 589    Accepted Submission(s): 338 Problem Description In Chinese Chess, there is one kind of powerful chessmen called Cannon. It can move

Hdu 1175 连连看(DFS)

Problem地址:http://acm.hdu.edu.cn/showproblem.php?pid=1175 因为题目只问能不能搜到,没问最少要几个弯才能搜到,所以我采取了DFS. 因为与Hdu 1728相比,都要考虑转弯次数,所以在判断转弯的次数上,两者可以相互借鉴. 这一点应该不难想到,在搜索前就应判断两点的值是否相等,以及两点的值中是否有0.如果不相等或其中一值为0,则可以判断是"NO". 时间虽是10000ms,但只是这样,还是超时. 后来又加了一个数组walk[][],用