USACO 3.2 Magic Squares 魔板
题目大意:
在成功地发明了魔方之后,拉比克先生发明了它的二维版本,称作魔板。这是一张有8个大小相同的格子的魔板:
1 2 3 4
8 7 6 5
我们知道魔板的每一个方格都有一种颜色。这8种颜色用前8个正整数来表示。可以用颜色的序列来表示一种魔板状态,规定从魔板的左上角开始,沿顺时针方向依次取出整数,构成一个颜色序列。对于上图的魔板状态,我们用序列(1,2,3,4,5,6,7,8)来表示。这是基本状态。 这里提供三种基本操作,分别用大写字母“A”,“B”,“C”来表示(可以通过这些操作改变魔板的状态):
“A”:交换上下两行;
“B”:将最右边的一列插入最左边;
“C”:魔板中央四格作顺时针旋转。
下面是对基本状态进行操作的示范:
A: 8 7 6 5
1 2 3 4
B: 4 1 2 3
5 8 7 6
C: 1 7 2 4
8 6 3 5
对于每种可能的状态,这三种基本操作都可以使用。
你要编程计算用最少的基本操作完成基本状态到目标状态的转换,输出基本操作序列。目标状态为八个数,a[i]表示第i位的目标状态。
基本状态必为12345678
所有整数范围均在1~8
题解:
广搜+hash:
这题的变化可以发现只有8!的情况总数,所以用hash判断当前搜的结果是否已经被遍历过,可以极大的优化时间,注意字符串的长度要限制,不要会炸内存= =
然后搜索有个预处理,你可以预判他每次操作以后,当前这个位置会被移到哪个位置,这时候开个rule表示当前数字做了i操作会被移到什么位置。
然后就是广搜= =深搜有很大可能栈溢出或者死循环到炸,所以不建议采取。
constmodn=1000007;rule:array[1..3,1..8] of byte=((8,7,6,5,4,3,2,1),(4,1,2,3,6,7,8,5),(1,7,2,4,5,3,6,8));varstate,hash:array [0..modn] of string[8];f,w:array [0..modn] of longint;i,x,ans:longint;p,s:string;function find(st:string):boolean;
vari:longint;
beginval(st,i);i:=i mod modn;while (hash[i]<>'') and (hash[i]<>st) and (i<modn) do inc(i);if hash[i]=''then begin hash[i]:=st; exit(false); endelse exit(true);end;procedure print(t:longint);
beginif t=1 then exit;inc(ans);s:=chr(64+w[t])+s;print(f[t]);
end;procedure bfs;
varhead,tail,i,j:longint;
beginhead:=0; tail:=1;w[1]:=0; f[1]:=0;state[1]:='12345678';if state[1]=p then exit;repeatinc(head);for i:=1 to 3 dobegininc(tail);f[tail]:=head;w[tail]:=i;state[tail]:=state[head];for j:=1 to 8 dostate[tail,j]:=state[head,rule[i,j]];if find(state[tail]) then dec(tail);if state[tail]=p thenbeginprint(tail);tail:=0;exit;end;end;until head>=tail;
end;beginp:='';for i:=1 to 8 dobeginread(x);p:=p+chr(48+ord(x));end;bfs;writeln(ans);writeln(s);
end.
USACO 3.2 Magic Squares 魔板相关推荐
- USACO 3.2 Magic Squares 魔板 (BFS-HASH)
题意: 给定1234/换行/5678,用下面几种方法变到制定的数 "A":交换上下两行: "B":将最右边的一列插入最左边: "C":中央四 ...
- Magic Squares 魔板 (BFS+HASH)
Description 在成功地发明了魔方之后,拉比克先生发明了它的二维版本,称作魔板.这是一张有8个大小相同的格子的魔板: 1 2 3 4 8 7 6 5 我们知道魔板的每一个方格都有一种颜色.这8 ...
- [USACO3.2]Magic Squares 魔板
题目大意 给出一个2*4的矩阵,有3种基本操作 A B C 交换上下两行 将最右边的一列插入最左边 中央四格作顺时针旋转 基本状态: 1 2 3 4 8 7 6 5 给定一个目标状态,求最少的基本操作 ...
- 魔板 Magic Squares(bfs优化)
[USACO3.2]魔板 Magic Squares 题目背景 在成功地发明了魔方之后,鲁比克先生发明了它的二维版本,称作魔板.这是一张有8个大小相同的格子的魔板: 1 2 3 4 8 7 6 5 题 ...
- [USACO3.2]魔板 Magic Squares
[USACO3.2]魔板 Magic Squares 题目背景 在成功地发明了魔方之后,鲁比克先生发明了它的二维版本,称作魔板.这是一张有8个大小相同的格子的魔板: 1 2 3 4 8 7 6 5 题 ...
- 洛谷P2730 [IOI]魔板 Magic Squares
题目背景 在成功地发明了魔方之后,鲁比克先生发明了它的二维版本,称作魔板.这是一张有8个大小相同的格子的魔板: 1 2 3 4 8 7 6 5 题目描述 我们知道魔板的每一个方格都有一种颜色.这8种颜 ...
- P2730 魔板 Magic Squares
不看题解肯定不会系列... 这道题可以用Cantor展开解决. Cantor展开可以求出一个数组是在全排列中的第几个. 具体怎么操作自己百度. Cantor展开的公式是:\(a[1] * (n - 1 ...
- java51游戏_Java作业实践(一)魔板游戏
课题:魔板游戏 一.课设要求 1.基本功能 (1)游戏规则 一个3×3的魔板,有一个格子是空的,其他格子内随机放置1-8共8个编号的方块,通过单击任意一个与空格子相邻的方块可以把该方块移入空格子,不断 ...
- 【题解】Luogu P2730 魔板
蒟蒻的第一道蓝题--好像也没有蓝的程度 一篇无STL的超弱题解(入门写法无误了QAQ 传送门 很经典的一道BFS 这是初始状态. 操作A 操作B 操作C 思路1 不使用cantor展开的情况 1. 对 ...
最新文章
- mormot支持websocket
- 利用rfcomm实现树莓派与手机通信_工业物联网 | 怎么用NodeRed实现树莓派与阿里云物联网平台通信?虹科告诉你!...
- 互联网前景如何,还值得进入嘛?
- python中or是什么意思-Python 中 (,|)和(and,or)之间的区别
- 高可用集群HA基本知识概述
- 函数无法识别_IF函数初级用法之一
- stagefright概述
- Power BI Desktop 中的数据源
- 简单管理Android手机程序的小程序
- uchome登陆机制分析(三)
- numpy多维数据存取
- centos 7安装matlab的两种方法(桌面安装和命令行安装)
- MapBoxSDK导入高版本unity2020、2021报错ARBackgroundRenderer
- 大数据告诉你,30年来有多少中国人移民美国
- springboot整合webSocket(看完即入门)
- die查壳工具 使用教程
- 重装和重装后该怎么办(通用版)
- 学计算机怎么写能力,计算机专业能力怎么写
- 回测平台小例子BKT:收盘前2分钟买,第二天卖
- MPC-M601 10Mbit/s高速逻辑门光电耦合器 代替LTV-M601
热门文章
- Wordpress搭建笔录
- 2022到2023基于java+微信小程序毕业设计课题参考
- 设计模式——观察者(监听者,订阅)模式||线程安全||c++详解
- 计算机专业学微积分有什么用,学微积分有什么用啊?
- VBS上传文件(转载)
- 【摘记】ABD-Net: Attentive but diverse Person Re-Id
- android打印机没反应了,使用蓝牙打印机在Android中打印不起作用
- 数据页和数据行(第八周翻译)
- 一种简单的2D Roguelike地图生成算法
- 用python爬取全国和全球疫情数据,并进行可视化分析(过程详细代码可运行)