noip搜索模拟题 骰子
骰子
dice.cpp/c/pas
1s/128M
【题目描述】
桌面上有两个特别的骰子。骰子的每一个面,都写了一个不同的数字。设第一个骰子上下左右前后分别为a1, a2, a3, a4, a5, a6,第二个骰子分别为b1, b2, b3, b4, b5, b6。保证每个数字在区间 [1, 6] 内,而且对于所有的i ≠ j都有ai ≠ aj, bi ≠ bj。特别地,每个骰子相对的两面数字之和都不会为7
一开始,两个骰子的摆放可能是不同的(即对应面的数字可能不同),所以Ddy想通过如下操作使两个骰子摆放变得相同
左转:以CG为轴向左转90°,使ACGE变成底部
右转:以DH为轴向右转90°,使BDHF变成底部
前转:以CD为轴向前转90°,使ABCD变成底部
后转:以GH为轴向后转90°,使EFHG变成底部
现在Ddy想知道达到目的的最小步数是多少。
【输入】
输入文件名:dice.in
多组数据,直到EOF
对于每组数据,两行,分别表示两个骰子的状态。
每行6个数分别a1, a2, …, a6和b1, b2, …, b6
【输出】
输出文件名:dice.out
对于每组数据输出一行,达到目的的最小步数。
无解则输出 -1
【输入样例】
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
【输出样例】
0
3
-1
题解:
因为每个骰子只有六个面,可以将这六个面的状态表示为一个六位数。(当然也可以用七进制或者六进制)
然后广搜,每一步都有四个方向可以选择,又因为每一个骰子都只有24种状态,记忆化一下就可以了。
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<cmath>
#include<algorithm>
#include<queue>
using namespace std;
int ans,a[],b[],ok;
int make(int a[])
{
int cnt=;
for(int i=;i<=;i++)cnt=cnt*+a[i];
return cnt;
}
int mmin[];
void bfs()
{
memset(mmin,/,sizeof(mmin));
int r=make(a),s;
queue<int>mem;queue<int>p;
mem.push(r);
p.push();
mmin[r]=;
while(!mem.empty())
{
int x=mem.front(),y=p.front();mem.pop();p.pop();
if(x==ok){ans=y;return;}
s=x%+((x/)%)*+((x/)%)*+((x/)%)*+(x/)*;
if(mmin[s]>y+){mem.push(s);p.push(y+);mmin[s]=y+;}
s=x%+((x/)%)*+((x/)%)*+((x/)%)*+(x/)/;
if(mmin[s]>y+){mem.push(s);p.push(y+);mmin[s]=y+;}
s=(x/)%*+(x%)*+((x/)%)*+(x/)%+(x/)*;
if(mmin[s]>y+){mem.push(s);p.push(y+);mmin[s]=y+;}
s=(x/)%*+(x%)*+((x/)%)*+((x/)%)*+x/;
if(mmin[s]>y+){mem.push(s);p.push(y+);mmin[s]=y+;}
}
}
int main()
{
freopen("dice.in","r",stdin);
freopen("dice.out","w",stdout);
int i,j;
while(scanf("%d",&a[])!=EOF)
{
for(i=;i<=;i++)scanf("%d",&a[i]);
for(i=;i<=;i++)scanf("%d",&b[i]);
ok=make(b);
ans=;
bfs();
if(ans!=)printf("%d\n",ans);
else printf("-1\n");
}
return ;
}
noip搜索模拟题 骰子的更多相关文章
- NOIP提高模拟题 混乱的队伍
混乱的奶牛 Description 混乱的奶牛 [Don Piele, 2007] Farmer John的N(4 <= N <= 16)头奶牛中的每一头都有一个唯一的编号S_i (1 & ...
- NOIP提高模拟题 完全平方数
完全平方数 (number.***(c/cpp/pas),1000ms,128mb) [问题描述] 一个数如果是另一个整数的完全平方,那么我们就称这个数为完全平方数(Pefect Sqaure),也称 ...
- 【NOIP 2011】Mayan游戏(搜索+模拟)
描述 Mayan puzzle是最近流行起来的一个游戏.游戏界面是一个7行5列的棋盘,上面堆放着一些方块,方块不能悬空堆放,即方块必须放在最下面一行,或者放在其他方块之上.**游戏通关是指在规定的步数 ...
- NOIP模拟题汇总(加厚版)
\(NOIP\)模拟题汇总(加厚版) T1 string 描述 有一个仅由 '0' 和 '1' 组成的字符串 \(A\),可以对其执行下列两个操作: 删除 \(A\)中的第一个字符: 若 \(A\)中 ...
- 【入门OJ】2003: [Noip模拟题]寻找羔羊
这里可以复制样例: 样例输入: agnusbgnus 样例输出: 6 这里是链接:[入门OJ]2003: [Noip模拟题]寻找羔羊 这里是题解: 题目是求子串个数,且要求简单去重. 对于一个例子(a ...
- NOIP 模拟题
目录 T1 : grid T2 : ling T3 : threebody 数据可私信我. T1 : grid 题目:在一个\(n*n\)的方格中,你只能斜着走.为了让问题更简单,你还有一次上下左右走 ...
- 9.9 NOIP模拟题
9.9 NOIP模拟题 T1 两个圆的面积求并 /* 计算圆的面积并 多个圆要用辛普森积分解决 这里只有两个,模拟计算就好 两圆相交时,面积并等于中间两个扇形面积减去两个三角形面积 余弦定理求角度,算 ...
- 8.22 NOIP 模拟题
8.22 NOIP 模拟题 编译命令 g++ -o * *.cpp gcc -o * *.c fpc *.pas 编译器版本 g++/gcc fpc 评测环境 位 Linux, .3GHZ CPU ...
- noip模拟题题解集
最近做模拟题看到一些好的题及题解. 升格思想: 核电站问题 一个核电站有N个放核物质的坑,坑排列在一条直线上.如果连续M个坑中放入核物质,则会发生爆炸,于是,在某些坑中可能不放核物质. 任务:对于给定 ...
随机推荐
- ivew组件的使用
iview的官网:https://www.iviewui.com/docs/guide/start 1.选择快速上手 2.安装 解压,cmd,cd进你解压后的文件,cnpm i 3.打包 npm ru ...
- Gym - 101341I:Matrix God(随机算法)
题意:给出N,以及三个矩阵A,B,C,大小都为N*N.问是否满足A*B=C: N<1000: 思路:由于矩阵乘法的复杂度为O(N^3):而部分验证又不能保证结果正确.我们巧妙地利用矩阵乘法的结合 ...
- Xcode 中的main.m
在几乎所有的程序开发中程序一般都是从main函数开始运行的,那么IOS程序也不例外,在上图中我们可以看到Xcode为我们生成了一个main.m文件: // // main.m // iOS // // ...
- BZOJ4278 [ONTAK2015]Tasowanie[后缀数组+贪心]
题目 求两数组归并后的数组最小字典序排列. 嘛,可能本人在贪心这块还是太弱了(或者说什么都弱),如果不知道是字符串题估计也想不起来用sa. 显然看得出归并时字典序小的那个数组先往里面加,这就是要比较两 ...
- 【Lintcode】106.Convert Sorted List to Balanced BST
题目: Given a singly linked list where elements are sorted in ascending order, convert it to a height ...
- jQuery之简单的表单验证
html部分: <body> <form method="post" action=""> <div class="in ...
- JAVA基础知识 String s = new String("ABC") VS String s = "abc"
一: String s = new String("ABC") VS String s = "abc" String s = "abc&q ...
- asp.net mvc 注册中的邮箱激活功能实现
基本流程图 注册页面就不再写出,现在将发送邮件的代码粘贴出来 public ActionResult SendEmial() { ; string validataCode = System.Gu ...
- [hdu3530]Subsequence (单调队列)
题意:求在一段序列中满足m<=max-min<=k的最大长度. 解题关键:单调队列+dp,维护前缀序列的最大最小值,一旦大于k,则移动左端点,取max即可. #include<cst ...
- windows7无法启动Telnet服务,出现…
windows7无法启动Telnet服务,出现错误1068 2012 年 03 月 16 日 在[控制面板--程序--打开或关闭Windows功能]中开启telnet服务器和客户端后,在运行窗口中输入 ...