BZOJ1085 騎士精神(A 啟發式搜尋)

2021-08-28 22:57:18 字數 1158 閱讀 4971

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

給定乙個初始的棋盤,怎樣才能經過移動變成如下目標棋盤:

為了體現出騎士精神,他們必須以最少的步數完成任務。

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

對於每組資料都輸出一行。如果能在15步以內(包括15步)到達目標狀態,則輸出步數,否則輸出-1。

210110

01*11

10111

01001

00000

01011

110*1

01110

01010

001007-1

如果沒有學過a*啟發式搜尋,那麼可以去網上搜一下折半搜尋、雜湊還有打表的程式,這裡給a*做法。

關於a*演算法,這裡給乙個鏈結,講的就是關於a*演算法的一些應用

然後就是關於這道題:顯然的是,如果我們選擇去移動棋子,那麼產生的分支就會非常多非常多,所以我們採用類似華容道一題的思想,我們移動空格,顯然,這樣做分支少了很多。

#includeusing namespace std;

const int maxn=8;

int base[5][5]=;

char a[maxn];

int dx[8]=;

int dy[8]=;

int ma[5][5],ans;

bool flag;

bool a_star(int s)

return 1;

}bool complete()

void dfs(int x,int y,int bs)

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

}int main()

else

ma[i][j]=a[j]-'0';

}} flag=true;

for(ans=0;ans<=15;++ans)

}if(flag)

printf("-1\n");

} return 0;

}

bzoj 1085 騎士精神

time limit 10 sec memory limit 162 mb submit 1461 solved 796 submit status discuss 在乙個5 5的棋盤上有12個白色的騎士和12個黑色的騎士,且有乙個空位。在任何時候乙個騎士都能按照騎士的走法 它可以走到和它橫座標相差...

BZOJ 1085 騎士精神 A

description 在乙個5 5的棋盤上有12個白色的騎士和12個黑色的騎士,且有乙個空位。在任何時候乙個騎士都能按照騎士的走法 它可以走到和它橫座標相差為1,縱座標相差為2或者橫座標相差為2,縱座標相差為1的格仔 移動到空位上。給定乙個初始的棋盤,怎樣才能經過移動變成如下目標棋盤 為了體現出騎...

bzoj1085 騎士精神 A

在乙個5 5的棋盤上有12個白色的騎士和12個黑色的騎士,且有乙個空位。在任何時候乙個騎士都能按照騎士的走法 它可以走到和它橫座標相差為1,縱座標相差為2或者橫座標相差為2,縱座標相差為1的格仔 移動到空位上。給定乙個初始的棋盤,怎樣才能經過移動變成如下目標棋盤 為了體現出騎士精神,他們必須以最少的...