一塊初始的2*4的模板,有三種變動方式,給定目標狀態,求出最少要多少步變成目標狀態,並輸出變動方式。
第一眼看這題的時候,心裡就想:這不就是bfs嗎,居然有提高+的水準(最多普及-),但這個記憶體是真心噁心,如果開八維存下每種數量的話肯定mle,所以我們可以用乙個24位的二進位制存下一種方案,再加上bfs即可。
#includeusingnamespace
std;
int d[1
<<24];//
最多24位,記錄成為這個狀態的最小步數
int q[50000];//
bfs的佇列
int qian[50000];//
記錄上一步的狀態
char c[50000];//
記錄上一步的行動(a,b,c之一)
void jiami(int k,int
s)//
轉化成八個整數
int jiexi(int
ins)
//轉化成二進位制
intmain()
//特判一下
memset(d,-1,sizeof(d));//
初始值為-1表示還沒有變成這個狀態
d[y]=0;//
一開始的次數是0
inthead,tail;
q[head=tail=1]=y;//
一開始的狀態
while(head<=tail)
//下面的都差不多
for(int i=0;i<8;++i)
t[i]=s[i];
for(int i=3;i>=1;--i)
swap(t[i],t[i-1]);//
把第一行的最右邊的插入最左邊的
for(int i=4;i<=6;++i)
swap(t[i],t[i+1]); //
把第二行的最右邊的插入最左邊的
ok=jiexi(t);
if(d[ok]==-1
)
for(int i=0;i<8;++i)
t[i]=s[i];
int tea=t[1
]; t[
1]=t[6
]; t[
6]=t[5
]; t[
5]=t[2
]; t[
2]=tea;//
直接暴力列舉
ok=jiexi(t);
if(d[ok]==-1
)
++head;
}printf(
"%d\n
", d[x]);
string sf;//
記錄最終答案
int now =tail;
while (q[now] !=y)
//倒推
int l =sf.size();
int us=0
;
for (int i = l-1; i >=0; --i)
return0;
}
洛谷 P2730 魔板
在成功地發明了魔方之後,魯比克先生發明了它的二維版本,稱作魔板。這是一張有8個大小相同的格仔的魔板 1 2 3 4 8 7 6 5 我們知道魔板的每乙個方格都有一種顏色。這8種顏色用前8個正整數來表示。可以用顏色的序列來表示一種魔板狀態,規定從魔板的左上角開始,沿順時針方向依次取出整數,構成乙個顏色...
洛谷P2730 魔板 Magic Squares
輸入格式 輸出格式輸入樣例 1 輸出樣例 1 include include using namespace std const int n 5e4 5,m 165e5 const int g 3 9 操作a 交換上下兩行 操作b 將最右邊的一列插入最左邊 操作c 魔板 四格作順時針旋轉 我們可以用...
洛谷 P1275 魔板
有這樣一種魔板 它是乙個長方形的面板,被劃分成n行m列的n m個方格。每個方格內有乙個小燈泡,燈泡的狀態有兩種 亮或暗 我們可以通過若干操作使魔板從乙個狀態改變為另乙個狀態。操作的方式有兩種 1 任選一行,改變該行中所有燈泡的狀態,即亮的變暗 暗的變亮 2 任選兩列,交換其位置。當然並不是任意的兩種...