[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]骑士精神的主要内容,如果未能解决你的问题,请参考以下文章