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个坑中放入核物质,则会发生爆炸,于是,在某些坑中可能不放核物质. 任务:对于给定 ...
随机推荐
- Python 实现「食行生鲜」签到领积分
用过食行生鲜的同学应该知道,每天可以在食行生鲜签到,签到可以领到 20 积分,在购物时可以抵 2 毛钱.钱虽少,但是积少成多,买菜时可以抵扣一两块钱还是不错的. 今天我们就用 Python 来实现自动 ...
- HDU 1166 敌兵布阵 (线段树单点修改和区间和查询)
Input 第一行一个整数T,表示有T组数据.每组数据第一行一个正整数N(N<=50000),表示敌人有N个工兵营地,接下来有N个正整数,第i个正整数ai代表第i个工兵营地里开始时有ai个人(1 ...
- ACM学习历程——HDU5015 233 Matrix(矩阵快速幂)(2014陕西网赛)
Description In our daily life we often use 233 to express our feelings. Actually, we may say 2333, 2 ...
- poj1456Supermarket——并查集压缩查找
题目:http://poj.org/problem?id=1456 排序+贪心,每次选利润最大的,放在可能的最靠后的日期卖出,利用并查集快速找到下一个符合的日期. 代码如下: #include< ...
- VMware vs openStack对比直观优势
openStack VS VMware直观优势:1.openStack设计架构开放.生态稳定 大型国际巨头公司支持及开发参与,功能版本迭代快,相对的VMware则是封闭的商业化系统.2.基于openS ...
- 【236】◀▶IEW-Unit01
Unit 1 Fast Food I.动名词的用法 Doing(V-ing) 核心思想:词性是名词,作用是动词 1. 名词 3)主语(句首) 保护环境是我们每个人的责任. Protecting th ...
- Redux API之combineReducers
combineReducers(reducers) 随着应用变得复杂,需要对 reducer 函数 进行拆分,拆分后的每一块独立负责管理 state 的一部分. combineReducers 辅助函 ...
- MSSQl分布式查询(转)
MSSQlServer所谓的分布式查询(Distributed Query)是能够访问存放在同一部计算机或不同计算机上的SQL Server或不同种类的数据源, 从概念上来说分布式查询与普通查询区别 ...
- sql中的begin....end
Begin...End之间的是一个语句块,一般Begin...End用在 ( 相当于 {})whileif等语句中在T_SQL中,if/while后只能紧跟一条sql语句,如果有多条则应该用Beg ...
- 牛客多校3 C-Shuffle Cards(rope大法解决数组分块)
Shuffle Cards 链接:https://www.nowcoder.com/acm/contest/141/C来源:牛客网 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 26 ...