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其实更合适

 

posted @ 2016-07-19 17:17  qlky  阅读(476)  评论(0编辑  收藏  举报