日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

bzoj1085骑士精神(搜索)

發(fā)布時間:2024/7/19 编程问答 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 bzoj1085骑士精神(搜索) 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

1085: [SCOI2005]騎士精神

Time Limit:?10 Sec??Memory Limit:?162 MB
Submit:?1893??Solved:?1051

Description

  在一個5×5的棋盤上有12個白色的騎士和12個黑色的騎士, 且有一個空位。在任何時候一個騎士都能按照騎
士的走法(它可以走到和它橫坐標相差為1,縱坐標相差為2或者橫坐標相差為2,縱坐標相差為1的格子)移動到空
位上。 給定一個初始的棋盤,怎樣才能經過移動變成如下目標棋盤: 為了體現(xiàn)出騎士精神,他們必須以最少的步
數(shù)完成任務。

Input

  第一行有一個正整數(shù)T(T<=10),表示一共有N組數(shù)據(jù)。接下來有T個5×5的矩陣,0表示白色騎士,1表示黑色騎
士,*表示空位。兩組數(shù)據(jù)之間沒有空行。

Output

  對于每組數(shù)據(jù)都輸出一行。如果能在15步以內(包括15步)到達目標狀態(tài),則輸出步數(shù),否則輸出-1。

Sample Input

2
10110
01*11
10111
01001
00000
01011
110*1
01110
01010
00100

Sample Output

7
-1
/* 迭代加深dfs經典題! 記錄目標狀態(tài),然后從起始狀態(tài)搜索。 爆搜可能超時,要加剪枝 */ #include<cstdio> #include<cstring> #include<iostream> #define limit 15 using namespace std; int T,ans=20,flag; int xx[9]={0,-2,-2,-1,-1,1,1,2,2}; int yy[9]={0,-1,1,-2,2,2,-2,1,-1}; int s[10][7],get[10][10]; int target[10][10]; char si;void get_t()//記錄目標狀態(tài) {target[1][1]=1;target[1][2]=1;target[1][3]=1;target[1][4]=1;target[1][5]=1;target[2][1]=0;target[2][2]=1;target[2][3]=1;target[2][4]=1;target[2][5]=1;target[3][1]=0;target[3][2]=0;target[3][3]=2;target[3][4]=1;target[3][5]=1;target[4][1]=0;target[4][2]=0;target[4][3]=0;target[4][4]=0;target[4][5]=1;target[5][1]=0;target[5][2]=0;target[5][3]=0;target[5][4]=0;target[5][5]=0; }int Judge()//計算當前狀態(tài)與目標狀態(tài)至少還有多少步 {int ret=0;for(int i=1;i<=5;i++)for(int j=1;j<=5;j++){if(s[i][j]!=target[i][j])ret++;}return ret; }void DFS(int now,int x,int y,int sum) {if(flag) return;int c=Judge();if(now==sum){if(c==0)flag=1,ans=sum;}if(now-1+c>sum) return;//最優(yōu)性剪枝:當前的步數(shù)+差異>限制步數(shù) for(int i=1;i<=8;i++){int nx=x+xx[i];int ny=y+yy[i];if(nx>0&&nx<=5&&ny>0&&ny<=5){swap(s[x][y],s[nx][ny]);DFS(now+1,nx,ny,sum);swap(s[x][y],s[nx][ny]);}} }int main() {scanf("%d",&T);get_t();while(T--){int x,y;for(int i=1;i<=5;i++)for(int j=1;j<=5;j++){cin>>si;if(si=='*'){x=i;y=j;get[i][j]=2;} else get[i][j]=si-'0';}for(int k=0;k<=limit;k++)//迭代加深限制步數(shù) {flag=0;ans=20;for(int i=1;i<=5;i++)for(int j=1;j<=5;j++)s[i][j]=get[i][j];DFS(0,x,y,k);if(ans==k) break;}if(ans<=15)printf("%d\n",ans);else printf("-1\n");}return 0; } 心若向陽,無謂悲傷

?

轉載于:https://www.cnblogs.com/L-Memory/p/6159812.html

總結

以上是生活随笔為你收集整理的bzoj1085骑士精神(搜索)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。