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

2022-07-08 19:45:14 字數 997 閱讀 6919

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

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

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

接著是乙個空行

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

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

輸入樣例#1:

1111

0000

1110

0010

1010

0101

1010

0101

輸出樣例#1:

bfs+位運算。

由於要求最小步數可以看出bfs的基本框架,但是如果用矩陣儲存狀態的話太耗費空間而且很慢,注意到每個格仔的狀態非0即1而且總格仔數目為16所以可以用二進位制的方法儲存狀態,相應判斷,轉移,判重。

注意這裡面將棋盤轉換成二進位制序列的時候,如何計算序列上的值在原4*4棋盤上的位置,以及使用異或運算去生成相鄰格仔交換後的新棋盤狀態對應的二進位制序列也是本題特色。

最後,由於是交換相鄰的格仔,理論上格仔和上下左右四個方向都可以互換,但是顯然對於每個格仔這樣列舉互換存在大量的重複,本質上對於每個格仔從上至下、從左到右只需要讓他往右和往下和相鄰的格仔嘗試互換即可。

#include#include#define for(a,b,c) for(int a=(b);a<(c);a++)

using namespace std;

const int maxn = 16;

struct node;

int a,b;

int vis[100000];

void bfs() );

while(!q.empty())

if(a==b) cout<<0;

else bfs();

}

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

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

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

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

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

this drop is gonna last forever!許多的小球乙個乙個的從一棵滿二叉樹上掉下來組成fbt full binary tree,滿二叉樹 每一時間,乙個正在下降的球第乙個訪問的是非葉子節點。然後繼續下降時,或者走右子樹,或者走左子樹,直到訪問到葉子節點。決定球運動方向的是每個...