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.


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章