FZU 2180 騎士 (雙向BFS)

2021-07-14 19:15:59 字數 1615 閱讀 8395

description

在乙個5×5的棋盤上有12個白色的騎士和12個黑色的騎士, 且有乙個空位。在任何時候乙個騎士都能按照騎士的走法(它可以走到和它橫座標相差為1,縱座標相差為2或者橫座標相差為2,縱座標相差為1的格仔)移動到空位上。

給定乙個初始的棋盤,怎樣才能經過移動變成如下目標棋盤: 為了體現出騎士精神,他們必須以最少的步數完成任務。

input

第一行有乙個正整數t(t<=10) 表示一共有t組資料 接下來有t個5*5的矩形。0表示白色騎士1表示黑色騎士,*表示空位。(每組資料間有空行)

output

對每組資料都輸出一行。如果能在15不以內(包括15)到達目標狀態,則輸出步數,否則輸出「bored!」沒有引號。

sample input

2

10110

01*11

10111

01001

00000

01011

110*1

01110

01010

00100

sample output

7

bored!

分析:我們從當前進行狀態搜尋,只需要標記好狀態就可以了。首先怎麼標記狀態:圖為5*5,我們考慮用25位二進位制表示。黑棋為1,白棋為0,『*』的的權相當於0, 所以我們用乙個int型變數就可以存下這個狀態。同時記錄'*'的位置,可以用乙個值代替它的座標即index=i*5+j(i,j為'*'的座標0<=i,j<=4)。所以用map,int>對映,表示本狀態,'*'位置,出現沒。

題意告訴步數<=15,拿最壞的情況15步來說,我們要走15步,每次有8個狀態,即8^15,即在佇列裡要存2^18個node型的資料,顯然抄記憶體。

我們在考慮用雙向bfs,正向:從給出的狀態搜,反向:從最終的狀態搜。

正搜和反搜的一步一步交替的,因此正搜和反搜的步數都不可能超過8。

正搜:在搜的過程中,判斷此狀態在反向中出現沒,若出現則答案為兩個狀態的步數和。

反搜:在搜的過程中,判斷此狀態在正向中出現沒,若出現則答案為兩個狀態的步數和。 

**:

#include#include#include#include#include#include#include#include#include#includeusing namespace std;

const int maxn=7;

char maze[maxn][maxn];

int dir[8][2]=;

struct node

friend bool operator

p=make_pair(tx.sta,tx.indx);

if(mp1.find(p)!=mp1.end())

}for(int i=0;i<=7;i++)

while(!q.empty()&&!q1.empty())

puts("bored!");

}int main()

; en=0;

for(i=0;i<5;i++)

while(t--)

if(ch[j]=='1')s|=(1<}}

st.sta=s;

bfs();

}return 0;

}

linux編譯安裝git2 18 0

切換目錄 建立目錄 更改所有者 apt安裝依賴軟體 解壓軟體包 ps 系統為deepin或者ubuntu,預設使用者為erge cd sudo mkdir soft sudo chown erge soft sudo apt get install dh autoreconf libcurl4 gn...

bzoj2180 最小直徑生成樹

傳送門 思路 先列舉圖的絕對中心在哪條邊 u,v 上,絕對中心就是到最遠點的距離最近的點,可以在邊上 設絕對中心到該邊乙個端點的距離為x 然後每個圖中的s點到它的距離就會是關於x的函式 即min dis u s x,dis v s l x 這是一條折線,那麼每個點到它的距離都會是一條折線 那麼,我們...

FZU 單詞問題

給出乙個完整的句子,這個句子中不包含不可見字元或者空格,於是在這個句子中有許多不同的單詞。乙個單詞是指一串連續的最長的英文本母 大寫或小寫 例如 abc 中,abc 就是乙個單詞,而 ab bc 都不算單詞。輸入包含多組資料 輸入資料第一行是乙個句子,只包含可見字元 不包含空格 句子長度不超過 10...