洛谷 P2730 魔板 Magic Squares

2022-09-20 23:00:33 字數 1587 閱讀 2999

一塊初始的2*4的模板,有三種變動方式,給定目標狀態,求出最少要多少步變成目標狀態,並輸出變動方式。

第一眼看這題的時候,心裡就想:這不就是bfs嗎,居然有提高+的水準(最多普及-),但這個記憶體是真心噁心,如果開八維存下每種數量的話肯定mle,所以我們可以用乙個24位的二進位制存下一種方案,再加上bfs即可。

#includeusing

namespace

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 任選兩列,交換其位置。當然並不是任意的兩種...