bzoj1085骑士精神(搜索)
生活随笔
收集整理的這篇文章主要介紹了
bzoj1085骑士精神(搜索)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
1085: [SCOI2005]騎士精神
Time Limit:?10 Sec??Memory Limit:?162 MBSubmit:?1893??Solved:?1051
Description
在一個5×5的棋盤上有12個白色的騎士和12個黑色的騎士, 且有一個空位。在任何時候一個騎士都能按照騎
士的走法(它可以走到和它橫坐標相差為1,縱坐標相差為2或者橫坐標相差為2,縱坐標相差為1的格子)移動到空
位上。 給定一個初始的棋盤,怎樣才能經過移動變成如下目標棋盤: 為了體現出騎士精神,他們必須以最少的步
數完成任務。
Input
第一行有一個正整數T(T<=10),表示一共有N組數據。接下來有T個5×5的矩陣,0表示白色騎士,1表示黑色騎
士,*表示空位。兩組數據之間沒有空行。
Output
對于每組數據都輸出一行。如果能在15步以內(包括15步)到達目標狀態(tài),則輸出步數,否則輸出-1。
Sample Input
210110
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)性剪枝:當前的步數+差異>限制步數 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++)//迭代加深限制步數 {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骑士精神(搜索)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: centOS 搭建pipelineDB
- 下一篇: Java易混小知识——equals方法和