• 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("!
    ")
    #define MAXN 100000 + 10
    #define MAX(a,b) a>b?a:b
    #define blank pf("
    ")
    #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
    ",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
    ",result);
        }
        return 0;
    }

    这题用bfs其实更合适

  • 相关阅读:
    php-Zip打包文件
    PHP命令行类库 climate
    vim 添加块注释
    冒泡排序|插入排序
    PHP-SeasLog安装和使用
    链表
    多线程上下文切换
    竞态与线程安全
    线程的生命周期
    线程创建的两种方法
  • 原文地址:https://www.cnblogs.com/qlky/p/5685579.html
Copyright © 2020-2023  润新知