[关闭]
@Chilling 2017-01-16T08:15:20.000000Z 字数 1645 阅读 864

BZOJ-1085: 骑士精神

搜索


Description

在一个5×5的棋盘上有12个白色的骑士和12个黑色的骑士, 且有一个空位。在任何时候一个骑士都能按照骑士的走法(它可以走到和它横坐标相差为1,纵坐标相差为2或者横坐标相差为2,纵坐标相差为1的格子)移动到空位上。

给定一个初始的棋盘,怎样才能经过移动变成如下目标棋盘: 为了体现出骑士精神,他们必须以最少的步数完成任务。
此处输入图片的描述

Input

第一行有一个正整数T(T<=10) 表示一共有T组数据 接下来有T个5*5的矩形。0表示白色骑士1表示黑色骑士,*表示空位。(每组数据间有空行)

Output

对每组数据都输出一行。如果能在15不以内(包括15)到达目标状态,则输出步数,否则输出“Bored!”没有引号。

Sample Input

2
10110
01*11
10111
01001
00000

01011
110*1
01110
01010
00100

Sample Output

7
Bored!

  1. #include<stdio.h>
  2. #include<algorithm>
  3. using namespace std;
  4. char a[5][5];
  5. char aim[5][5]={{'1','1','1','1','1'},{'0','1','1','1','1'},{'0','0','*','1','1'},{'0','0','0','0','1'},{'0','0','0','0','0'}};
  6. int dir[8][2]={1,2,1,-2,-1,2,-1,-2,2,1,2,-1,-2,1,-2,-1};
  7. int flag;
  8. int cmp() //比较目标与现在是否一致
  9. {
  10. int i,j;
  11. for(i=0;i<5;i++)
  12. for(j=0;j<5;j++)
  13. if(a[i][j]!=aim[i][j])
  14. return 0;
  15. return 1;
  16. }
  17. int jug(int nowstp,int needstp)//有几处不同,就最少要移动几次!
  18. {
  19. int i,j,count=0;
  20. for(i=0;i<5;i++)
  21. for(j=0;j<5;j++)
  22. if(a[i][j]!=aim[i][j])
  23. count++;
  24. if(count+nowstp>needstp)//如果现在最少移动的步数加上已经走的步数大于了例举的最小步数,那么说明不止移动这么多步
  25. return 0;
  26. return 1;
  27. }
  28. void dfs(int nowx,int nowy,int nowstp,int needstp)//现在的位置,现在的步数,例举的最小步数
  29. {
  30. if(nowstp==needstp)//如果现在的步数和例举步数相同并且和目标棋盘一致
  31. {
  32. if(cmp()==1)
  33. flag=1;
  34. return;
  35. }
  36. if(flag==1)
  37. return;
  38. for(int i=0;i<8;i++)
  39. {
  40. int nextx=nowx+dir[i][0];
  41. int nexty=nowy+dir[i][1];
  42. if(nextx>=0&&nextx<5&&nexty>=0&&nexty<5)
  43. {
  44. swap(a[nowx][nowy],a[nextx][nexty]);
  45. if(jug(nowstp,needstp)==1)
  46. dfs(nextx,nexty,nowstp+1,needstp);
  47. swap(a[nowx][nowy],a[nextx][nexty]);
  48. }
  49. }
  50. }
  51. int main()
  52. {
  53. int t,i,j,step,x,y;
  54. scanf("%d",&t);
  55. while(t--)
  56. {
  57. flag=0;
  58. for(i=0;i<5;i++)
  59. scanf("%s",a[i]);
  60. for(i=0;i<5;i++)
  61. for(j=0;j<5;j++)
  62. if(a[i][j]=='*')
  63. {
  64. x=i;
  65. y=j;
  66. }
  67. for(step=0;step<=15;step++)
  68. {
  69. dfs(x,y,0,step);
  70. if(flag==1)
  71. {
  72. printf("%d\n",step);
  73. break;
  74. }
  75. }
  76. if(flag==0)
  77. printf("Bored!\n");
  78. }
  79. return 0;
  80. }
添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注