[bzoj 1085]骑士精神

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[bzoj 1085]骑士精神相关的知识,希望对你有一定的参考价值。

A*真是神(MA)奇(ZHANG)

 


 

 

题目大意:

5*5棋盘上有黑,白马,给定初始和目标状态,求最小步数.

 

代码如下(又丑又慢):

 1 #include <cstdio>
 2 #include <algorithm>
 3 int ans[5][5] = {{1,1,1,1,1},{0,1,1,1,1},{0,0,-1,1,1},{0,0,0,0,1},{0,0,0,0,0}},
 4     dx[8] = {2,2,1,1,-1,-1,-2,-2},
 5     dy[8] = {1,-1,2,-2,2,-2,1,-1},T,k,mp[5][5],flag = 0,a,b;
 6 bool judge(int m[5][5]){for(int i = 0;i < 5;i++)for(int j = 0;j < 5;j++)if(ans[i][j] != m[i][j])return 0;return 1;}
 7 bool eva(int m[5][5],int s){int v = 0;for(int i = 0;i < 5;i++)for(int j = 0;j < 5;j++)if(ans[i][j] != m[i][j]){v++;if(v + s > k)return 0;}return 1;}
 8 void sch(int s,int m[5][5],int x,int y)
 9 {
10     if(s == k){if(judge(m))flag = 1;return;}if(flag)return;
11     for(int i = 0;i < 8;i++)
12     {
13         int nowx = x + dx[i],nowy = y + dy[i];
14         if(nowx < 0 || nowx > 4 || nowy < 0 || nowy > 4) continue;
15         std::swap(m[x][y],m[nowx][nowy]);if(eva(m,s))sch(s + 1,m,nowx,nowy);std::swap(m[x][y],m[nowx][nowy]);
16     }
17 }
18 int main()
19 {
20     scanf("%d",&T);while(T--)
21     {
22         for(int i = 0;i < 5;i++){char c[10];scanf("%s",c);for(int j = 0;j < 5;j++) mp[i][j] = ((c[j] == *) ? (a = i,b = j,-1) : (c[j] - 0));}
23         for(k = 1;k <= 15;k++){sch(0,mp,a,b);if(flag){printf("%d\n",k);break;}}
24         if(!flag)printf("-1\n");flag = 0;
25     }
26     return 0;
27 }

以上是关于[bzoj 1085]骑士精神的主要内容,如果未能解决你的问题,请参考以下文章

BZOJ1085: [SCOI2005]骑士精神

bzoj1085[SCOI2005]骑士精神

bzoj1085 [SCOI2005]骑士精神

BZOJ 1085 [SCOI2005]骑士精神

bzoj1085: [SCOI2005]骑士精神(a*)

Bzoj 1085: [SCOI2005]骑士精神 (dfs)