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

题意: 有两个色子,每次可以选择向前面、后面、左边或是右边翻转90度。给你色子的初始状态,输出使的两个筛子达到相同状态的最少次数,如果无法达到,则输出-1。

题解: BFS,网络赛处女A,两次TLE~~ 我用了hash判重AC,不知道需不需要用这个~~ 貌似状态不多,普通的方法应该也可以过吧!BFS部分,就是对四种情况进行遍历。

AC代码:

#include<cstdio>
#include<cmath>
#include<cstring>
#define Max 5000000
bool visit[2000000]={0};
struct Node{
	int a[6],step;
}map[Max],temp,end;
int calc[6]={1,10,100,1000,10000,100000};
int hash(Node x)
{  	 int sum=0;
     for(int i=0;i<6;i++){
     	sum+=x.a[i]*calc[i];
     }
     return sum;
}
int main(){   //六个面的编号  上0  下2  左3  右1  前4  后5
	while(~scanf("%d%d%d%d%d%d",&map[0].a[0],&map[0].a[2],&map[0].a[3],&map[0].a[1],&map[0].a[4],&map[0].a[5])){
	memset(visit,0,sizeof(visit));
	scanf("%d%d%d%d%d%d",&end.a[0],&end.a[2],&end.a[3],&end.a[1],&end.a[4],&end.a[5]);
	map[0].step=0; end.step=0;
	visit[hash(end)]=1;
    visit[hash(map[0])]=1;
	int exdir=0,nodedir=0,flag=1;
	if(hash(map[0])==hash(end)){   //完全一样,直接输出0
		printf("%d\n",0);
	 continue;
	}
	while(nodedir<=exdir&&exdir<Max&&flag){
		for(int i=0;i<4;i++){
			temp=map[nodedir];
			//向前翻转
			if(!i){
				int x,y;
				x=temp.a[0]; temp.a[0]=temp.a[5];
				y=temp.a[4]; temp.a[4]=x;
				x=temp.a[2]; temp.a[2]=y;
				temp.a[5]=x;
			}
			//向后翻转
			else if(i==1){
				int x=temp.a[5]; temp.a[5]=temp.a[0];
				int y=temp.a[2]; temp.a[2]=x;
				x=temp.a[4]; temp.a[4]=y;
				temp.a[0]=x;
			}
			//向左翻转
			else if(i==2){
				int x=temp.a[3]; temp.a[3]=temp.a[0];
				int y=temp.a[2]; temp.a[2]=x;
				x=temp.a[1]; temp.a[1]=y;
				temp.a[0]=x;
			}
			//向右翻转
			else{
				int x=temp.a[1]; temp.a[1]=temp.a[0];
				int y=temp.a[2]; temp.a[2]=x;
				x=temp.a[3]; temp.a[3]=y;
				temp.a[0]=x;
			}
			temp.step++;
			if(hash(temp)==hash(end)) {   //达到目标,直接输出
				printf("%d\n",temp.step);
				flag=0;
				break;
			}
			if(!visit[hash(temp)]) {   //新节点加入队列
			 map[++exdir]=temp;
    		 visit[hash(temp)]=1;
			}
		}
		nodedir++;
	}
	if(flag) printf("-1\n");  //无法达到目标状态
	}
	return 0;
}
时间: 2024-10-19 14:45:40

HDOJ 5012 Dice--2014网络赛西安赛区F题的相关文章

HDOJ 5007 Post Robot--2014网络赛西安赛区A题

题目来源:http://acm.hdu.edu.cn/showproblem.php?pid=5007 Post Robot Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others) Total Submission(s): 193    Accepted Submission(s): 164 Problem Description DT is a big fan of digital

[hdu5136]Yue Fei&#39;s Battle 2014 亚洲区域赛广州赛区J题(dp)

转载请注明出处: http://www.cnblogs.com/fraud/          ——by fraud 现场赛的时候由于有个地方有点小问题,没有成功AC,导致与金牌失之交臂. 由于今天下午有点事情,无法打重现,所以下午只是花了十分钟做了一道J题,抢了个FB,2333333333 Yue Fei's Battle Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 512000/512000 K (Java/Others)T

08年acm区域赛北京赛区 部分题解题报告

08年区域赛北京赛区 http://poj.org/searchproblem?field=source&key=Beijing+2008 POJ 3921 Destroying the bus stations 题目还是比较难的,当时的榜似乎只有4/25的通过/提交,其实题目数据很水.学长转换模型写了网络流求最小割,可以AC,不过自己造了个数据推翻了正确性.我写了个很挫的bfs套bfs,外层是最小的删除点数,内层是求最短路,数据很水可以AC.但比较蛋疼的在于bfs耗内存,而且队列中的点数是阶乘

2014 39th ACM-ICPC 西安赛区 总结

西安,打铁. 出发前听说是大赛区,签到的时候看了秩序册的队伍情况,264支队伍. 在听说是大赛区之前,我觉得我们队应该是银首,运气好+发挥超常的话或许有金,即保银冲金. 听到大赛区之后,觉得可能金区有难度,毕竟金的数量不根据队伍总数改变.当时觉得应该是银,运气差+发挥失常就是铜首. 万万没想到,打铁. 同行的另外还有三支队伍.大二的两支队伍,一支银一支铜.好像我们学院好久没有打铁了 热身赛,纸质很差,纸张黄黄的,字体模糊的,还很薄.共4题. 先是2题水题CD,我跟JM迅速水完后,WJ说B是冒泡的

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 nu

2014西安赛区C题

将A[i]同他后面比他小的建边,然后求最大密度子图 #include <iostream> #include <algorithm> #include <string.h> #include <cstdio> #include <vector> #include <queue> #include <cmath> using namespace std; const int maxn=105; const double ep

hdu 5038 (2014北京网络赛G 排序水题)

题意:有n个数字,带入10000 - (100 - ai) ^ 2公式得到n个数,输出n个数中频率最大的数,如果有并列就按值从小到大都输出输出,如果频率相同的数字是全部的n个数,就输出Bad....题解:统计数字个数和频率,排序后输出. Sample Input36100 100 100 99 98 1016100 100 100 99 99 1016100 100 98 99 99 97 Sample OutputCase #1:10000Case #2:Bad MushroomCase #3

网络赛牡丹江赛区E ZOJ3813(线段树)

http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=5345 给定序列P,定义序列S为P反复重复得到的一个无穷长的序列: if P = 3423537, then S = 3423537342353734235373423537... 再定义G(l, r) = Sl - Sl+1 + Sl+2 - ... + (-1)r-lSr 给两种操作: 1 x d:将序列P的第x想改为d(d是一个简单数字0~9) 2 l r  :求sum

urumqi 网络赛 C Coconut 水题

题目链接: 放不出来 题目描述: 每个站点有a[i] 个 椰子, 相邻站点的距离给出, 每天需要b个椰子, 问是否能够坚持到终点. 解题思路: 水一波儿 代码: #include <iostream> #include <cstdio> #include <string> #include <vector> #include <cstring> #include <iterator> #include <cmath> #i