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

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

输入输出样例
输入样例#1:
2
101101011010110
01∗1101*1101∗11
101111011110111
010010100101001
000000000000000
010110101101011
110∗1110*1110∗1
011100111001110
010100101001010
001000010000100
输出样例#1:
7
-1

这道题是cdcq出的考试题qwq,刚看到这道题的时候除了普通搜索还真没想到其他的算法(因为没见过QAQ)
可能考试的时候比较懵打了一个贼复杂的dfs…
还没调出来-.-
下午就知道是IDA*0.0
这道题中,由于步数限制给的很明确,所以迭代加深还是能比较明显的看出来的,
但就算是迭代加深这1s的时间也不够用,而且还没有啥好的剪枝。
于是我们可能就会感叹:要是代码跟我脑子一样自我判断就好了0.0
然后就出现了搜索中的估价函数
估价函数就类似于模拟自己在决策时影响自己判断的因素,首先要证明这些因素满足条件时一定能得到正确答案,然后把他们写成函数以影响自己的搜索(emm这么说会不会有点抽象)
就是把自己手推样例时所想的判断方法写在程序里。
然后在判断是否继续搜索时加上这个条件

这道题很容易想到我们自己在判断时是尽量把不合法的棋子往合法的地方移动
因此就用当前状态与目标状态不匹配的格子作为估价函数
判断条件就用当前步数+不匹配格数
且因为当估价函数为零时的状态一定是目标状态,所以这个策略一定是合法的。

然后就是看了才能懂我刚才在说什么的代码

#include<bits/stdc++.h>using namespace std;int goal[5][5] = {{1, 1, 1, 1, 1}, {0, 1, 1, 1, 1,}, {0, 0, 2, 1, 1}, {0, 0, 0, 0, 1}, {0, 0, 0, 0, 0}};int mp[5][5], t, pd;
int dx[8] = {1, -1, 2, -2, 1, -1, 2, -2};
int dy[8] = {2, 2, -1, -1, -2, -2, 1, 1};int tx, ty;int g(){int ret = 0;for(int i = 0; i < 5; ++i)for(int j = 0; j < 5; ++j)if(mp[i][j] != goal[i][j]) ++ret;return ret;
}bool IDA(int maxd, int d, int x, int y){if(!g()) return 1;if(g() + d - 1 > maxd) return 0;for(int i = 0; i < 8; ++i){int x1 = x + dx[i], y1 = y + dy[i];if(x1 < 0 || x1 > 4 || y1 < 0 || y1 > 4) continue;swap(mp[x1][y1], mp[x][y]);if(IDA(maxd, d + 1, x1, y1)) return 1;swap(mp[x1][y1], mp[x][y]); }return 0;
}
int main()
{scanf("%d", &t);while(t--){pd = 0;for(int i = 0; i < 5; ++i){char s[5]; scanf("%s", s);for(int j = 0; j < 5; ++j){if(s[j] - '0' == 0) mp[i][j] = 0;else if(s[j] - '0' == 1) mp[i][j] = 1;else mp[i][j] = 2, tx = i, ty = j;}}for(int i = 1; i <= 15; ++i)if(IDA(i, 0, tx, ty)){pd = i; break;}if(pd) printf("%d\n", pd);else puts("-1");}return 0;
}

洛谷2324骑士精神相关推荐

  1. 洛谷 - P2324 - 骑士精神 - A*搜索

    为什么估价是16,因为最后一步复原空格可以恢复两个位置,当然设成17.18都可以. #include<bits/stdc++.h> using namespace std; typedef ...

  2. 网络流建模方法(四)—— 互不攻击问题 洛谷 P3353 骑士共存问题 (附 洛谷 P2774 方格取数问题)

    网络流建模方法(四)互不攻击问题,或者说是共存问题, 这类题目看起来有点像二分图匹配,这类题目我们就是建一个二分图然后跑最大流 还是先说题目洛谷P3353 题目描述 在一个 nn个方格的国际象棋棋盘上 ...

  3. 洛谷-2324-骑士精神

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

  4. 洛谷 P2695 骑士的工作

    P2695 骑士的工作 题目背景 你作为一个村的村长,保卫村庄是理所当然的了.今天,村庄里来了一只恶龙,他有n个头,恶龙到处杀人放火.你着急了.不过天无绝人之路,现在来了一个骑士团.里面有m位成员(往 ...

  5. 洛谷 P3355 骑士共存问题

    题意:给你一个棋盘,然后有一个骑士rider,棋盘上有一些障碍,问你最多放多少个骑士 思路:期初我一直以为这种题是什么八皇后问题的变形,队友告诉我,这是网络流,由于这道题的黄色格子上的棋子的下一步总是 ...

  6. 洛谷P3355 骑士共存问题

    题目描述 在一个 n*n个方格的国际象棋棋盘上,马(骑士)可以攻击的棋盘方格如图所示.棋盘上某些方格设置了障碍,骑士不得进入 对于给定的 n*n 个方格的国际象棋棋盘和障碍标志,计算棋盘上最多可以放置 ...

  7. 洛谷 - P3355 骑士共存问题(二分图最大独立集)

    题目链接:点击查看 题目大意:给出一个n*n的棋盘,上面有m个点无法放置棋子,现在要求尽可能多的放 马,使得所有的马两两无法互相攻击,题目要求输出可以放置的最大数量 题目分析:二分图最大独立集的裸题, ...

  8. 网络流24题 洛谷 3355 骑士共存

    转换成最小割: #include <bits/stdc++.h>using namespace std ;const int mx [ 9 ] = { 2 , 2 , -2 , -2 , ...

  9. 洛谷 P2324 [SCOI2005]骑士精神 解题报告

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

最新文章

  1. Java高并发编程:总线锁定和缓存一致性的问题
  2. centos 6 防火墙开启端口无效问题
  3. 自己做网站,论坛类型的
  4. Visual Tracker Benchmark
  5. Android 安卓动画 补间动画 - 平移动画
  6. 应用系统开发--银行系统
  7. 第13章Stata Logistic回归分析
  8. 《Python自然语言处理》——1.1 语言计算:文本和词汇
  9. 开放网络基金会(ONF)发布开放式创新渠道 开放网络迎来变革
  10. 山还是山 水还是水
  11. BAT等公司高薪招聘Android开发面试题目集锦
  12. D2. Xor-Subsequence (hard version)
  13. 普通浏览器会泄露信息吗?使用安全浏览器如何做到隐私保护?
  14. 课后作业week 5 —— 两款修图软件优势及创新分析
  15. 赛微微电启动上市发行:生产依赖外协加工厂商,市盈率偏高
  16. 路由器里面的DHCP是什么功能?
  17. 业务系统里的Office文档如何在线编辑
  18. Ayoa永久免费版网页在线思维脑图软件
  19. 淘宝运营去哪里学,可以自学吗
  20. 招标文件和竞争性谈判文件区别

热门文章

  1. Verilog语法之数学函数
  2. 企业级nginx使用
  3. 企业邮箱注册申请流程,企业邮箱怎么注册账号?
  4. AI+医疗:使用神经网络进行医学影像识别分析 ⛵
  5. 三星账户联系人同步到手机上_如何将健身数据从Samsung Health同步到Google Fit
  6. python编程可以用来干嘛,python程序员是干嘛的
  7. 理查和马文价值导向选股法则!
  8. 二、操作系统基本原理
  9. android 获取类对象(代码片段)
  10. WIN7,让光驱走开