HDOJ 5012 Dice

BFS爆搜

Dice

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)

Total Submission(s): 284    Accepted Submission(s): 166

Problem Description

There are 2 special dices on the table. On each face of the dice, a distinct number was written. Consider a1.a2,a3,a4,a5,a6 to be numbers written on top face, bottom face, left face, right face,
front face and back face of dice A. Similarly, consider b1.b2,b3,b4,b5,b6 to be numbers on specific faces of dice B. It’s guaranteed that all numbers written on dices are integers no smaller
than 1 and no more than 6 while ai ≠ aj and bi ≠ bj for all i ≠ j. Specially, sum of numbers on opposite faces may not be 7.

At the beginning, the two dices may face different(which means there exist some i, ai ≠ bi). Ddy wants to make the two dices look the same from all directions(which means for all i, ai = bi) only by the following
four rotation operations.(Please read the picture for more information)

Now Ddy wants to calculate the minimal steps that he has to take to achieve his goal.

Input

There are multiple test cases. Please process till EOF.

For each case, the first line consists of six integers a1,a2,a3,a4,a5,a6, representing the numbers on dice A.

The second line consists of six integers b1,b2,b3,b4,b5,b6, representing the numbers on dice B.

Output

For each test case, print a line with a number representing the answer. If there’s no way to make two dices exactly the same, output -1.

Sample Input

1 2 3 4 5 6
1 2 3 4 5 6
1 2 3 4 5 6
1 2 5 6 4 3
1 2 3 4 5 6
1 4 2 5 3 6

Sample Output

0
3
-1

Source

2014 ACM/ICPC Asia Regional Xi‘an Online

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <map>
#include <set>
#include <queue>

using namespace std;

struct DICE
{
	int face[6];
}A,B;

bool check(DICE a,DICE b)
{
	for(int i=0;i<6;i++)
		if(a.face[i]!=b.face[i]) return false;
	return true;
}

bool checkIMP(DICE x,DICE y)
{
	int a[6],b[6];
	for(int i=0;i<6;i++)
	{
		a[i]=x.face[i];
		b[i]=y.face[i];
	}
	sort(a,a+6);
	sort(b,b+6);
	for(int i=0;i<6;i++)
	{
		if(a[i]!=b[i]) return false;
	}
	return true;
}

void init(DICE& x)
{
	int a[6];
	for(int i=0;i<6;i++)
		a[i]=x.face[i];
	sort(a,a+6);
	for(int i=0;i<6;i++)
	{
		x.face[i]=lower_bound(a,a+6,x.face[i])-a+1;
	}
}

void showit(DICE x)
{
	for(int i=0;i<6;i++)
		cout<<x.face[i]<<",";
	cout<<endl;
}

int hash(DICE x)
{
	int ret=0;
	for(int i=0;i<6;i++)
		ret=ret*10+x.face[i];
	return ret;
}

void rhash(int h,DICE& x)
{
	for(int i=5;i>=0;i--)
	{
		x.face[i]=h%10;
		h/=10;
	}
}

void LEFT(DICE& X)
{
	int a[6];
	for(int i=0;i<6;i++)
		a[i]=X.face[i];
	X.face[0]=a[3];
	X.face[1]=a[2];
	X.face[2]=a[0];
	X.face[3]=a[1];
}

void RIGHT(DICE& X)
{
	int a[6];
	for(int i=0;i<6;i++)
		a[i]=X.face[i];
	X.face[0]=a[2];
	X.face[1]=a[3];
	X.face[3]=a[0];
	X.face[2]=a[1];
}

void UP(DICE& X)
{
	int a[6];
	for(int i=0;i<6;i++)
		a[i]=X.face[i];
	X.face[0]=a[5];
	X.face[1]=a[4];
	X.face[4]=a[0];
	X.face[5]=a[1];
}

void DOWN(DICE& X)
{
	int a[6];
	for(int i=0;i<6;i++)
		a[i]=X.face[i];
	X.face[0]=a[4];
	X.face[1]=a[5];
	X.face[4]=a[1];
	X.face[5]=a[0];
}

bool st[1000001];

void bfs()
{
	queue<int> q,qt;
	memset(st,0,sizeof(st));
	q.push(hash(A));
	st[hash(A)]=0;
	qt.push(0);
	bool flag=false;
	while(!q.empty())
	{
		int time=qt.front(); qt.pop();
		int zhi=q.front(); q.pop();

		DICE X,Y;int ha;
		rhash(zhi,X); Y=X;
		if(check(Y,B)==true)
		{
			flag=true;
			printf("%d\n",time);
			return ;
		}
		///LEFT
		LEFT(X);
		ha=hash(X);
		if(st[ha]==false)
		{
			st[ha]=true;
			q.push(ha);
			qt.push(time+1);
		}

		///Right
		X=Y;
		RIGHT(X);
		ha=hash(X);
		if(st[ha]==false)
		{
			st[ha]=true;
			q.push(ha);
			qt.push(time+1);
		}

		///UP
		X=Y;
		UP(X);
		ha=hash(X);
		if(st[ha]==false)
		{
			st[ha]=true;
			q.push(ha);
			qt.push(time+1);
		}

		///DOWN
		X=Y;
		DOWN(X);
		ha=hash(X);
		if(st[ha]==false)
		{
			st[ha]=true;
			q.push(ha);
			qt.push(time+1);
		}
	}
	if(flag==false) puts("-1");
}

int main()
{
	int x;
	while(scanf("%d",&x)!=EOF)
	{
		A.face[0]=x;
		for(int i=1;i<6;i++) scanf("%d",&A.face[i]);
		for(int i=0;i<6;i++) scanf("%d",&B.face[i]);

		if(checkIMP(A,B)==false)
		{
			puts("-1"); continue;
		}
		init(A); init(B);
		if(check(A,B)==true)
		{
			puts("0"); continue;
		}
		bfs();
	}
	return 0;
}
时间: 2024-08-06 16:01:06

HDOJ 5012 Dice的相关文章

HDOJ 5012 Dice--2014网络赛西安赛区F题

题目来源:http://acm.hdu.edu.cn/showproblem.php?pid=5012 Dice Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others) Total Submission(s): 307    Accepted Submission(s): 183 Problem Description There are 2 special dices on the

HDU 5012 Dice (bfs + 记忆化搜索)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5012 Problem Description There are 2 special dices on the table. On each face of the dice, a distinct number was written. Consider a1.a2,a3,a4,a5,a6 to be numbers written on top face, bottom face, left f

ACM学习历程—HDU 5012 Dice(ACM西安网赛)(bfs)

Problem Description There are 2 special dices on the table. On each face of the dice, a distinct number was written. Consider a1.a2,a3,a4,a5,a6 to be numbers written on top face, bottom face, left face, right face, front face and back face of dice A.

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 5012 Dice

Dice Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others) Total Submission(s): 440    Accepted Submission(s): 259 Problem Description There are 2 special dices on the table. On each face of the dice, a distinct number w

HDU - 5012 Dice(BFS)

Problem Description There are 2 special dices on the table. On each face of the dice, a distinct number was written. Consider a1.a2,a3,a4,a5,a6 to be numbers written on top face, bottom face, left face, right face, front face and back face of dice A.

2014 网选 5012 Dice(bfs模板)

1 /* 2 题意:就是给定两个筛子,每个筛子上6个面,每个面的数字属于[1,6], 且互不相同! 3 问a筛子最少经过按照题目规定的要求转动,达到和b筛子上下左右前后的数字相同! 4 5 思路:很直白的bfs,将每一种状态对应一个数字,保证这种状态不会重新加入队列中! 6 */ 7 #include<iostream> 8 #include<cstdio> 9 #include<cstring> 10 #include<algorithm> 11 #inc

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

hdu5012 Dice

http://acm.hdu.edu.cn/showproblem.php?pid=5012 Dice Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)Total Submission(s): 1449 Accepted Submission(s): 742 Problem Description There are 2 special dices on the table. On e