洛谷P1117 棋盤遊戲

2021-09-01 09:24:25 字數 1035 閱讀 3902

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

輸入前四行,每行 4 個數字(1 或者 0),描述了初始棋盤;接著是乙個空行;第六到第九行,每行 4 個數字(1 或者 0),描述了最終棋盤。

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

求最短移動路徑加上這種棋盤問題很容易想到要用搜尋,但直接用的話判斷終止條件為遍歷兩個圖是否相等。。很容易超時,然後我們就要想辦法把這個判斷簡化;

發現輸入的棋盤是用0和1來表示的,大小也固定為4*4,所以我們可以用16位二進位制來表示這個棋盤,為了方便我們將第乙個數作為最高位,以此類推。

因為題目要求是相鄰(上下左右)兩個棋子交換,所以我們可以從四個頂點任意乙個向其對角線方向進行搜尋,方便起見,我們從左上角向右下搜尋。左右交換、上下交換。

最好自己寫一下二進位制數,方便理解

#include

#include

#include

#include

#include

#include

#include

#include

using

namespace std;

struct stu

;int ans1,ans2;

bool vis[

70000];

char ch;

intbfs()

}//printf("%d %d\n",temp&(1(y<3&&

(temp&(1

<(temp&(1

<))

//當前數與上下交換後數不一致則儲存}}

}}intmain()

// cout(int i=

15;i>=

0;i--

)// cout("%d\n"

,bfs()

);return0;

}

字串hash 洛谷P1117 優秀的拆分

這裡講一95分的演算法 就是用字串hash取搞 怎麼弄呢?我們列舉aa 所有的aa 用字串hash取判斷a和a是否相同 然後記錄aa的開頭位置和結尾位置 然後乘法原理統計答案就好了 include define pow define ll long long using namespace std ...

P1117數的劃分

將整數n分成k份,且每份不能為空,任意兩份不能相同 不考慮順序 例如 n 7,k 3,下面三種分法被認為是相同的。1,1,5 1,5,1 5,1,1 問有多少種不同的分法。輸入n,k 6乙個整數,即不同的分法。7 3 4每個測試點1s noip2001第二題 dp。把i個球放在k個盒子裡,就是i 1...

洛谷 P3956 棋盤

js省裡冬令營夏令營講深搜都講到了 今天上午測試的題,15分,因為剪枝沒剪乾淨,少了個等於號,於是本來能拿到的分也沒拿到,唉 主要思想dfs 剪枝 include using namespace std int m,n 依照題目 int a 107 107 存顏色 int vis 107 107 存...