1286. 【USACO题库】3.2.5 Magic Squares魔板 (Standard IO)

题目描述

在成功地发明了魔方之后,拉比克先生发明了它的二维版本,称作魔板。这是一张有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



对于每种可能的状态,这三种基本操作都可以使用。


你要编程计算用最少的基本操作完成基本状态到特殊状态的转换,输出基本操作序列。


PROGRAM NAME: msquare


INPUT FORMAT


只有一行,包括8个整数,用空格分开(这些整数在范围 1——8 之间),表示目标状态。


SAMPLE INPUT (file msquare.in)


2 6 8 4 5 7 3 1 












Line 1: 包括一个整数,表示最短操作序列的长度。
Line 2: 在字典序中最早出现的操作序列,用字符串表示,除最后一行外,每行输出60个字符。


OUTPUT FORMAT



SAMPLE OUTPUT (file msquare.out)


7 BCABCCB 

输入

输出

样例输入

 
       

样例输出

 
       

数据范围限制



usaco第3部分。。。。好怕怕呀。。。。

然而。。又一道淼题!

spfa直接秒杀,注意细节即可。

注意魔板的初始顺序。

哈希可加可不加。。。。。。。

代码(请勿抄袭):

var
        i,j,k,m,n,o,p,l:longint;
        s,tg:string;
        t,tt,ttt,tttt:char;
        h:array[1..100000] of longint;
        time:array[1..100000] of string;
        len:array[1..100000] of longint;
        bz:array[12345678..87654321] of boolean;
{function hash(k:longint):longint;
var
        x,y:longint;
begin
        y:=k mod 1000000;
        while (bz[y]<>0) and (bz[y]<>k) do y:=y mod 1000000+1;
        if bz[y]<>k then begin
                bz[y]:=k;
                exit(1);
        end else exit(-1);
end;  }
procedure work;
var
        i1,j1:longint;
        s1:string;
        t1:char;
begin
        str(h[i],s1);
        t1:=s1[1];s1[1]:=s1[5];s1[5]:=t1;
        t1:=s1[2];s1[2]:=s1[6];s1[6]:=t1;
        t1:=s1[3];s1[3]:=s1[7];s1[7]:=t1;
        t1:=s1[4];s1[4]:=s1[8];s1[8]:=t1;
        inc(j);
        val(s1,h[j]);
        len[j]:=len[i]+1;
        time[j]:=time[i]+'A';
end;
procedure work1;
var
        s1,t2:string;
        t1:char;
begin
        str(h[i],s1);
        t1:=s1[4];
        s1[4]:=s1[3];
        s1[3]:=s1[2];
        s1[2]:=s1[1];
        s1[1]:=t1;
        t1:=s1[8];
        s1[8]:=s1[7];
        s1[7]:=s1[6];
        s1[6]:=s1[5];
        s1[5]:=t1;
        inc(j);
        val(s1,h[j]);
        len[j]:=len[i]+1;
        time[j]:=time[i]+'B';
end;
procedure work2;
var
        s1,t2:string;
        t1:char;
begin
        str(h[i],s1);
        t1:=s1[7];
        s1[7]:=s1[3];
        s1[3]:=s1[2];
        s1[2]:=s1[6];
        s1[6]:=t1;
        inc(j);
        val(s1,h[j]);
        len[j]:=len[i]+1;
        time[j]:=time[i]+'C';
end;
begin
        for i:=1 to 8 do  begin
                read(j);
                str(j,tg);
                s:=s+tg;
        end;
        if s='12345678' then begin
                writeln(0);
                halt;
        end; 
        t:=s[5];tt:=s[6];ttt:=s[7];tttt:=s[8];
        s[5]:=tttt;s[6]:=ttt;s[7]:=tt;s[8]:=t;
        val(s,o);
        h[1]:=12348765;
        i:=0;
        j:=1;
        fillchar(bz,sizeof(bz),true);
        while i<j do begin
                inc(i);
                if bz[h[i]] then bz[h[i]]:=false else continue;
                for k:=1 to 3 do begin
                       {if len[j]=0 then p:=maxlongint else p:=len[j];
                        if len[i]+1>p then continue;  }
                        case k of
                                1:work;
                                2:work1;
                                3:work2;
                        end;
                        if h[j]=o then begin
                                writeln(len[j]);
                                writeln(time[j]);
                                halt;
                        end;
                end;
        end;
end.


猜你喜欢

转载自blog.csdn.net/wangyuda123456789/article/details/77010884