在乙個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*搜尋。。。
1 #include2 #include3 #include4 #include5 #include6 #include7 #includeview code8 #include9 #include10 #include11 #include
12#define inf 1000000000
13#define maxn 10000+5
14#define maxm 10000+5
15#define eps 1e-10
16#define ll long long
17#define for0(i,n) for(int i=0;i<=(n);i++)
18#define for1(i,n) for(int i=1;i<=(n);i++)
19#define for2(i,x,y) for(int i=(x);i<=(y);i++)
20#define for3(i,x,y) for(int i=(x);i>=(y);i--)
21#define for4(i,x) for(int i=head[x],y=e[i].go;i;i=e[i].next,y=e[i].go)
22using
namespace
std;
23int
read()
26while(ch>='
0'&&ch<='9')
27return x*f;28}
29int
t,k;
30int ans[5][5]=,
31 ,
32 ,
33 ,
34 };
35int xx[8]=,yy[8]=,flag=0;36
int judge(int a[5][5
])42
int eva(int a[5][5],int
s)47
return1;
48}49void search(int s,int a[5][5],int x,int
y)51
if(flag==1)return;52
for(int i=0;i<8;i++)59}
60int
main()
71else a[i][j]=ch[j]-'0'
;72}73
}74for(k=1;k<=15;k++)
75 }
76if(!flag)printf("
-1\n");
77else flag=0;78
}79return0;
80 }
1085 SCOI2005 騎士精神
time limit 10 sec memory limit 162 mb submit 1557 solved 857 submit status discuss 在乙個5 5的棋盤上有12個白色的騎士和12個黑色的騎士,且有乙個空位。在任何時候乙個騎士都能按照騎 士的走法 它可以走到和它橫座標相...
BZOJ 1085 SCOI 2005 騎士精神
之前聽說過ida 好像很優越啊。估價函式為不在目標位置的棋子個數。列舉一遍最大搜尋深度即可。還得好好斟酌一下要列舉的搜尋深度。344ms。include include using namespace std define rep i,j,k for int i j imaxdep return 0...
bzoj1085 SCOI2005 騎士精神
此題用到了a 演算法以及迭代加深搜尋。其實做本題之前看到過這個東西,發現估價什麼的好複雜,一直不會用。但應用於本題很容易就能實現,只要和最終結果一一比對即可。演算法如下,借鑑了hzwer大神的寫法。include include using namespace std int ans 5 5 int...