資訊學一本通(1451 棋盤遊戲)

2021-10-25 07:41:18 字數 1647 閱讀 4177

題目描述

在乙個4*4的棋盤上有8個黑棋和8個白棋,當且僅當兩個格仔有公共邊,這兩個格仔上的棋是相鄰的。移動棋子的規則是交換相鄰兩個棋子。現在給出乙個初始棋盤和乙個最終棋盤,要求你找出乙個最短的移動串行使初始棋盤變為最終棋盤。

klux說:「這麼簡單的題目,我都會做!」

輸入格式:

第1到4行每行四個數字(1或者0),描述了初始棋盤

接著是乙個空行

第6到9行每行四個數字,描述了最終棋盤

輸出格式:

輸出只有一行是乙個整數n,表示最少的移動步數。

輸入樣例#1:

1111

0000

1110

0010

1010

0101

1010

0101

輸出樣例#1:

4判斷一種狀態到另一種狀態

一種是深搜,直接將初始狀態和末狀態記錄下來,爆搜每個點的目的地,每一次搜尋的代價為,abs(橫座標差值)+abs(縱座標差值)

廣搜就是模擬每一次到達的狀態,因為有216種,所以需要用2進製模擬格仔的交換過程,分成分成向下和向左

不過我還是不太懂,為什麼tmp^^wz

能代表下乙個狀態,有大佬看見希望能告訴我一下

#include

#include

#include

#include

#include

using namespace std;

#define sum 15

#define n 4

#define line 3;

int ans,n,st,ed;

struct node

;int vis[100000]

;queueq;

void bfs())

; while(

!q.empty(

))

for(int i=15;i>=0;i--));}}

if(x<3&&

(tmp&w)

!=(tmp&dz))

);}}}}

}int main(

) for(int i=15;i>=0;i--)

if(st==ed) printf(

"0\n");

else bfs();

return 0;

}

//#include

#include

#include

#include

using namespace std;

char a[20]

[20],b[50]

;int sx[10],sy[10],ex[10],ey[10]

;int m,n,ans=0x3f3f3f,vis[10]

;void dfs(int k,int sum)

for(int i=1;i<=n;i++)}}

int main(

) if(b[j]

>a[i]

[j])}}

dfs(1,0)

; printf(

"%d\n",ans)

;return 0;

}

BFS 資訊學一本通(1451 棋盤遊戲)

在乙個4 4的棋盤上有8個黑棋和8個白棋,當且僅當兩個格仔有公共邊,這兩個格仔上的棋是相鄰的。移動棋子的規則是交換相鄰兩個棋子。現在給出乙個初始棋盤和乙個最終棋盤,要求你找出乙個最短的移動串行使初始棋盤變為最終棋盤。klux說 這麼簡單的題目,我都會做!第1到4行每行四個數字 1或者0 描述了初始棋...

資訊學奧賽一本通 1218 取石子遊戲

時間限制 1000 ms 記憶體限制 65536 kb 提交數 2463 通過數 1138 有兩堆石子,兩個人輪流去取。每次取的時候,只能從較多的那堆石子裡取,並且取的數目必須是較少的那堆石子數目的整數倍,最後誰能夠把一堆石子取空誰就算贏。比如初始的時候兩堆石子的數目是25和7。25 7 11 7 ...

資訊學奧賽一本通 小球(drop)

許多的小球乙個乙個的從一棵滿二叉樹上掉下來組成fbt full binary tree,滿二叉樹 每一時間,乙個正在下降的球第乙個訪問的是非葉子節點。然後繼續下降時,或者走右子樹,或者走左子樹,直到訪問到葉子節點。決定球運動方向的是每個節點的布林值。最初,所有的節點都是false,當訪問到乙個節點時...