码迷,mamicode.com
首页 > 其他好文 > 详细

[bzoj 1085]骑士精神

时间:2017-10-05 20:53:14      阅读:158      评论:0      收藏:0      [点我收藏+]

标签:blog   i++   printf   void   bzoj   for   line   www   can   

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]骑士精神

标签:blog   i++   printf   void   bzoj   for   line   www   can   

原文地址:http://www.cnblogs.com/gcc314/p/7629934.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!