HDU 5012 骰子旋转(DFS)

时间:2023-03-08 17:30:39

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[],b[]; int dice[][]
{
{,,,,,},
{,,,,,},
{,,,,,},
{,,,,,},
{,,,,,}
}; void dfs(int cnt)
{
if(cnt>=) return;
int i,j,flag = ;
for(i=;i<;i++)
{
if(a[i]!=b[i])
{
flag = ;
break;
}
} if(flag)
{
result = min(result,cnt);
return;
}
//pf("cnt%d\n",cnt);
int ans = -,tmp[];
for(i=;i<;i++) tmp[i] = a[i]; for(i=;i<;i++)
{
for(j=;j<;j++)
{
a[j] = tmp[dice[i][j]];
//pf("%d ",a[j]);
}
//blank;
dfs(cnt+);
}
for(i=;i<;i++) a[i] = tmp[i];
return;
} int main()
{
int i,j;
while(sf("%d",&a[])!=EOF)
{
result = ;
for(i=;i<;i++) sf("%d",&a[i]);
for(i=;i<;i++) sf("%d",&b[i]);
dfs();
if(result == ) result = -;
pf("%d\n",result);
}
return ;
}

这题用bfs其实更合适

相关文章