Luogu P2730 魔板 Magic Squares
P2730 魔板 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
對於每種可能的狀態,這三種基本操作都可以使用。
你要編程計算用最少的基本操作完成基本狀態到目標狀態的轉換,輸出基本操作序列。
輸入輸出格式
輸入格式:
只有一行,包括8個整數,用空格分開(這些整數在範圍 1——8 之間)不換行,表示目標狀態。
輸出格式:
Line 1: 包括一個整數,表示最短操作序列的長度。
Line 2: 在字典序中最早出現的操作序列,用字符串表示,除最後一行外,每行輸出60個字符。
輸入輸出樣例
輸入樣例#1:
2 6 8 4 5 7 3 1
輸出樣例#1:
7
BCABCCB
說明
題目翻譯來自NOCOW。
USACO Training Section 3.2
題解:
這是一道簡單的寬搜題。
因為這是期末考完寫的第一道題,所以手感很差,寫了好久。
把序列哈希出一個值後就可以用數組(幾步可以實現,這一步實現的方法,上一步是哪一個)存了。
還有輸出的時候用直接用棧來幫助比較快。
其實這題數據很弱,直接用map也是可以的。
因為太容易了,所以就不詳細講了。
#include<bits/stdc++.h> namespace ZDY{ #define ll long long #define db double #define sht short #define MB template <class T> #define Fur(i,x,y) for(int i=x;i<=y;i++) #define fur(i,x,y) for(int i=x;i<=y;i++) #define Fdr(i,x,y) for(int i=x;i>=y;i--) #define clr(x,y) memset(x,y,sizeof(x)) #define cpy(x,y) memcpy(x,y,sizeof(x)) #define fl(i,x) for(ri i=head[x],to;to=e[i].to,i;i=e[i].nxt) #define inf 0x3f3f3f3f #define fin(s) freopen(s".in","r",stdin) #define fout(s) freopen(s".out","w",stdout) #define l2(n) (ceil(log2(n))) MB T ABS(T x){return x>0?x:-x;} MB T MAX(T x,T y){return x>y?x:y;} MB T MIN(T x,T y){return x<y?x:y;} MB T GCD(T x,T y){return y?GCD(y,x%y):x;} void SWAP(int &x,int &y){x^=y;y^=x;x^=y;} //char gc(){static char buf[1000000],*s,*t;return s==t?(((t=(s=buf)+fread(buf,1,1000000,stdin))==s)?-1:*s++) : *s++;} #define gc getchar int gi(){int x=0,f=0;char c=gc();while(c<'0'||'9'<c){if(c=='-')f=!f;c=gc();}while('0'<=c&&c<='9'){x=x*10+c-48;c=gc();}return f?(-x):x;} }using namespace ZDY;using namespace std; #define N 30000007 struct mf{ int a[2][4]; void b(int p){ if(p==1)Fur(i,0,3)SWAP(a[0][i],a[1][i]); if(p==2)Fdr(i,3,1)SWAP(a[0][i],a[0][(i+4-1)%4]),SWAP(a[1][i],a[1][(i+4-1)%4]); if(p==3){int t=a[1][1];a[1][1]=a[1][2];a[1][2]=a[0][2];a[0][2]=a[0][1];a[0][1]=t;} } void get(){Fur(i,0,3)a[0][i]=gi();Fdr(i,3,0)a[1][i]=gi();} int hash(){int t=0;Fur(i,0,3)t=t*10+a[0][i];Fdr(i,3,0)t=t*10+a[1][i];return t%N;} }q[N]; int v[N],la[N],k[N],ans; void dfs(mf x){ if(la[x.hash()])dfs(q[la[x.hash()]]); putchar(k[x.hash()]+'A'-1); } void bfs(){ int h=0,t=1; mf x,n; while(h<t){ x=q[h++]; if(x.hash()==ans){ printf("%d\n",v[ans]-1); dfs(x); return; } Fur(i,1,3){ n=x;n.b(i); if(!v[n.hash()]){v[n.hash()]=v[x.hash()]+1;la[n.hash()]=h-1;k[n.hash()]=i;q[t++]=n;} } } } int main(){ mf x;x.get(); ans=x.hash(); if(ans==12345678){printf("0\n");exit(0);} Fur(i,0,3)q[0].a[0][i]=i+1; Fur(i,0,3)q[0].a[1][i]=8-i; v[q[0].hash()]=1; bfs(); }
Luogu P2730 魔板 Magic Squares