USACO 3.2 Magic Squares 魔板 ssl 1692 BFS-HASH
2016-09-13 17:25
323 查看
Description
在成功地发明了魔方之后,拉比克先生发明了它的二维版本,称作魔板。这是一张有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
对于每种可能的状态,这三种基本操作都可以使用。
你要编程计算用最少的基本操作完成基本状态到目标状态的转换,输出基本操作序列。
Input
只有一行,包括8个整数,用空格分开(这些整数在范围 1——8 之间),表示目标状态。Output
Line 1: 包括一个整数,表示最短操作序列的长度。Line 2: 在字典序中最早出现的操作序列,用字符串表示,除最后一行外,每行输出60个字符。
分析
只是一个很水的bfs+hash记录状态,一年前刷的。 ps:不要在意一年的写的格式
代码
const b:array[1..3] of char=('A','B','C'); q=98763; var h:array[0..100000] of longint; a,c:array[1..100000] of longint; f,s3:array[1..100000] of char; n:longint; procedure init; var i,j:longint; begin n:=0; for i:=1 to 8 do begin read(j); n:=n*10+j; end; end; function hash(x:longint):longint; var i:longint; begin i:=x mod q; while (h[i]<>0)and(h[i]<>x) do i:=i mod (q+1)+1; hash:=i; end; procedure main; var i,j,k,l,p:longint; head,tail:longint; m,m1:array[1..8] of integer; begin head:=0; tail:=1; a[1]:=12345678; h[hash(12345678)]:=12345678; c[1]:=0; repeat head:=head+1; j:=a[head]; i:=8; while j<>0 do begin m1[i]:=j mod 10; j:=j div 10; i:=i-1; end; for i:=1 to 3 do begin m:=m1; case i of 1:begin l:=7; for j:=1 to 4 do begin k:=m[j]; m[j]:=m[j+l]; m[j+l]:=k; l:=l-2; end; end; 2:begin k:=m[4]; l:=m[5]; p:=1; for j:=4 downto 2 do begin m[j]:=m[j-1]; m[j+p]:=m[j+p+1]; p:=p+2; end; m[1]:=k; m[8]:=l; end; 3:begin k:=m[2]; m[2]:=m[7]; m[7]:=m[6]; m[6]:=m[3]; m[3]:=k; end; end; j:=1; k:=0; while j<>9 do begin k:=k*10+m[j]; j:=j+1; end; if h[hash(k)]<>k then begin tail:=tail+1; a[tail]:=k; f[tail]:=b[i]; h[hash(k)]:=k; c[tail]:=head; if k=n then begin j:=0; l:=tail; while l<>0 do begin j:=j+1; s3[j]:=f[l]; l:=c[l]; end; j:=j-1; writeln(j); l:=0; for p:=j downto 1 do begin l:=l+1; write(s3[p]); if l mod 60=0 then writeln; end; exit; end; end; end; until head>=tail; end; begin init; if n=12345678 then begin write(0); halt; end; main; end.
相关文章推荐
- USACO 3.2 Magic Squares 魔板 (BFS-HASH)
- USACO_3.2_Magic Squares 魔板_BFS_HASH
- USACO 3.2 Magic Squares 魔板 (BFS-HASH)
- USACO 3.2 Magic Squares 魔板 (BFS-HASH)
- USACO 3.2 Magic Squares 魔板 (BFS-HASH)
- USACO Section 3.2 Magic Squares(BFS)
- [USACO3.2]魔板 Magic Squares
- USACO-Section 3.2 Magic Squares(BFS)
- USACO 3.2 Magic Squares(记录路径的BFS)
- USACO 3.2 Magic Squares 魔板
- ssl1692-魔板【HSAH,bfs】
- USACO / Magic Squares(经典BFS+Cantor展开hash)
- SSL-1693 USACO 3.2 Sweet Butter 香甜的黄油 (Bellman DIJ SPFA)
- SSL_1692 魔板
- usaco 3.2 Magic Squares
- 魔板 bfs() 预处理,记录每种状态。然后状态置换,(重点要用到全排列的hash记录状态)
- usaco 3.2 Magic Squares
- USACO-Section3.2 Magic Squares【宽度优先搜索】
- 【USACO 3.2】Magic Squares
- USACO section 3.2 Magic Squares(STL+广搜)