P2324 [SCOI2005]骑士精神

题目描述

输入输出格式

输入格式:

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

输出格式:

对于每组数据都输出一行。如果能在15步以内(包括15步)到达目标状态,则输出步数,否则输出-1。


一看到15,莫名的想到迭代加深。

然后发现这个玩意12都跑不过去。想过估价函数,但感觉操作次数会很多就放弃了。

实际上这个题的重点就是估价函数

设估价函数为与目标状态不同的点的个数+1(这个+1是为了最后一步空白的)

然后跑IDA* 就行了(事实是A*更快)


Code:

  1. #include <cstdio>
  2. const int N=6;
  3. int t,sta[N][N],step,ex,ey,flag;
  4. int to[N][N]=
  5. {
  6. {0,0,0,0,0,0},
  7. {0,1,1,1,1,1},
  8. {0,-1,1,1,1,1},
  9. {0,-1,-1,0,1,1},
  10. {0,-1,-1,-1,-1,1},
  11. {0,-1,-1,-1,-1,-1},
  12. };
  13. inline int estimate()
  14. {
  15. int res=0;
  16. for(int i=1;i<=5;i++)
  17. for(int j=1;j<=5;j++)
  18. if(to[i][j]!=sta[i][j])
  19. res++;
  20. return res;
  21. }
  22. int dx[9]={0,-2,-1,1,2,2,1,-1,-2};
  23. int dy[9]={0,1,2,2,1,-1,-2,-2,-1};
  24. inline void Swap(int &x,int &y)
  25. {
  26. int tmp=x;
  27. x=y;
  28. y=tmp;
  29. }
  30. void dfs(int dep,int x,int y)
  31. {
  32. if(flag) return;
  33. if(estimate()+dep>step+1) return;
  34. if(step==dep){flag=1;return;}
  35. for(int i=1;!flag&&i<=8;i++)
  36. {
  37. int X=x+dx[i],Y=y+dy[i];
  38. if(X>0&&Y>0&&X<=5&&Y<=5)
  39. {
  40. Swap(sta[x][y],sta[X][Y]);
  41. dfs(dep+1,X,Y);
  42. Swap(sta[x][y],sta[X][Y]);
  43. }
  44. }
  45. }
  46. void work()
  47. {
  48. flag=0;
  49. if(estimate()==0) {printf("0\n");return;}
  50. for(step=1;step<=15;step++)
  51. {
  52. dfs(0,ex,ey);
  53. if(flag)
  54. {
  55. printf("%d\n",step);
  56. return;
  57. }
  58. }
  59. printf("-1\n");
  60. }
  61. int main()
  62. {
  63. scanf("%d",&t);
  64. while(t--)
  65. {
  66. for(int i=1;i<=5;i++)
  67. {
  68. scanf("\n");
  69. for(int j=1;j<=5;j++)
  70. {
  71. char c;
  72. scanf("%c",&c);
  73. if(c=='*') ex=i,ey=j,sta[i][j]=0;
  74. else if(c=='1') sta[i][j]=1;
  75. else sta[i][j]=-1;
  76. }
  77. }
  78. work();
  79. }
  80. return 0;
  81. }

2018.8.2

洛谷 P2324 [SCOI2005]骑士精神 解题报告的更多相关文章

  1. 洛谷 P2324 [SCOI2005]骑士精神

    题目描述 输入输出格式 输入格式: 第一行有一个正整数T(T<=10),表示一共有N组数据.接下来有T个5×5的矩阵,0表示白色骑士,1表示黑色骑士,*表示空位.两组数据之间没有空行. 输出格式 ...

  2. 洛谷P2324 [SCOI2005] 骑士精神

    题目 方法很多,最经典的是用搜索的算法,也就是\(IDA*\)算法搜索. \(IDA*\)算法是每次规定一个搜索深度,并在搜索的时候限制该搜索深度,从而达到把深搜的优点和广搜的优点结合起来优化时间的一 ...

  3. [luogu P2324] [SCOI2005]骑士精神

    [luogu P2324] [SCOI2005]骑士精神 题目描述 输入输出格式 输入格式: 第一行有一个正整数T(T<=10),表示一共有N组数据.接下来有T个5×5的矩阵,0表示白色骑士,1 ...

  4. P2324 [SCOI2005]骑士精神(A*)

    P2324 [SCOI2005]骑士精神 A*与爆搜的不同就是它有一个估价函数$h(x)$ 这个估价函数一般设为从当前状态到终点状态的估计最短步数,这样可以有效剪枝 但估计值必须严格小于等于实际剩余步 ...

  5. 洛谷_Cx的故事_解题报告_第四题70

    1.并查集求最小生成树 Code: #include <stdio.h> #include <stdlib.h>   struct node {     long x,y,c; ...

  6. 洛谷 P2317 [HNOI2005]星际贸易 解题报告

    P2317 [HNOI2005]星际贸易 题目描述 输入输出格式 输入格式: 输出格式: 如果可以找到这样的方案,那么输出文件output.txt中包含两个整数X和Y.X表示贸易额,Y表示净利润并且两 ...

  7. 洛谷 P3802 小魔女帕琪 解题报告

    P3802 小魔女帕琪 题目背景 从前有一个聪明的小魔女帕琪,兴趣是狩猎吸血鬼. 帕琪能熟练使用七种属性(金.木.水.火.土.日.月)的魔法,除了能使用这么多种属性魔法外,她还能将两种以上属性组合,从 ...

  8. 洛谷 P2606 [ZJOI2010]排列计数 解题报告

    P2606 [ZJOI2010]排列计数 题目描述 称一个\(1,2,...,N\)的排列\(P_1,P_2...,P_n\)是\(Magic\)的,当且仅当对所以的\(2<=i<=N\) ...

  9. 洛谷1303 A*B Problem 解题报告

    洛谷1303 A*B Problem 本题地址:http://www.luogu.org/problem/show?pid=1303 题目描述 求两数的积. 输入输出格式 输入格式: 两个数 输出格式 ...

随机推荐

  1. Ruby 基础教程1-5

    1.条件语句 if unless case        unless和if相反,条件不成立则执行   2.条件  除了 false和nil 其他都是true   3.unless 语法        ...

  2. python3读取csv文件

    代码如下 import csv with open('D:\\abc\\userinfo.csv',newline='') as f: reader = csv.reader(f) for row i ...

  3. APP上下左右滑动屏幕的处理

    #获得机器屏幕大小x,y driver = self.driver def getSize(): x = driver.get_window_size()['width'] y = driver.ge ...

  4. Fiddler使用总结(一)

    Fiddler基础知识 .Fiddler是强大的抓包工具,它的原理是以web代理服务器的形式进行工作的,使用的代理地址是:127.0.0.1,端口默认为8888,我们也可以通过设置进行修改. .代理就 ...

  5. js 加密 crypto-js des加密

    js 加密 crypto-js    https://www.npmjs.com/package/crypto-js   DES  举例:   js 引入:   <script src=&quo ...

  6. 手把手教你封装 Vue 组件,并使用 npm 发布

    Vue 开发插件 开发之前先看看官网的 开发规范 我们开发的之后期望的结果是支持 import.require 或者直接使用 script 标签的形式引入,就像这样: // 这里注意一下包的名字前缀是 ...

  7. Redis4.0支持的新功能说明

    本文以华为云DCS for Redis版本为例,介绍Redis4.0的新功能.文章转载自华为云帮助中心. 与Redis3.x版本相比,DCS的Redis4.x以上版本,除了开源Redis增加的特性之外 ...

  8. 从零开始的Python学习Episode 6——字符串操作

    字符串操作 一.输出重复字符串 print('smile'*6) #输出6个smile 二.通过引索输出部分字符串 print('smile'[1:]) print('smile'[1:3]) #输出 ...

  9. LeetCode 98——验证二叉搜索树

    1. 题目 2. 解答 2.1. 方法一 我们初始化根节点的范围为长整形数据的最小最大值 \([LONG\_MIN,LONG\_MAX]\),则其左子节点的取值范围为 \([LONG\_MIN,根节点 ...

  10. Ubuntu16.04安装truffle时的一些错误

    1.使用truffle时出现 Error: /usr/bin/env: node: 没有那个文件或目录 1.如果是用sudo apt-get install nodejs命令安装的nodejs, ub ...