题目

此题根据题目可知是迭代加深搜索。
首先应该枚举空格的位置,让空格像一个马一样移动。
但迭代加深搜索之后时间复杂度还是非常的高,根本过不了题。
感觉也想不出什么减枝,于是便要用到了乐观估计函数Optimistic Estimation Function
以3种颜色的格子来表示原棋盘:

如果我们要从一个状态抵达到原棋盘,那么需要的步数绝对是小于当前状态与原棋盘不同的格子的数量、
那么我们的乐观估计函数就出来了。如果当前状态与原棋盘的不同格子数量小于我们的剩余的步数,那么肯定是抵达不了的,return回去就行。

代码

#include <iostream>
#include <cstring>
using namespace std;#define N 510int dir[8][2]={{2,1},{2,-1},{-2,1},{-2,-1},{1,2},{1,-2},{-1,-2},{-1,2}};
int fuck[10][10]={{0,0,0,0,0,0},{0,1,1,1,1,1},{0,0,1,1,1,1},{0,0,0,2,1,1},{0,0,0,0,0,1}};
int a[10][10],T,px,py,len,flag=0;int dif() {int sum=0;for(int i=1;i<=5;i++) for(int j=1;j<=5;j++)if(a[i][j] != fuck[i][j]) sum++;return sum;
}void dfs(int step) {if(step>len) {if(dif()==0) flag=1;return ;}if(dif()>len-step+2) return ;for(int k=0;k<8;k++) {int tx=px+dir[k][0],ty=py+dir[k][1];if(  tx<1 || tx>5 || ty<1 || ty>5) continue;swap(a[tx][ty],a[px][py]);swap(px,tx);swap(py,ty);dfs(step+1);swap(a[tx][ty],a[px][py]);swap(px,tx);swap(py,ty);}
}int main() {cin>>T;while(T--) {flag=0;memset(a,0,sizeof(a)); for(int i=1;i<=5;i++) for(int j=1;j<=5;j++) {char l;cin>>l;if(l=='1') a[i][j]=1;else if(l=='0') a[i][j]=0;else a[i][j]=2,px=i,py=j;}for(len=0;len<=15;len++) {dfs(1);if(flag)  {cout<<len<<endl;break;}}if(!flag)cout<<-1<<endl;}
}

在我的程序里有这一句:

if(dif()>len-step+2) return ;

因为有这种特例,保险起见,多加一个1。

转载于:https://www.cnblogs.com/MisakaMKT/p/10769866.html

迭代加深搜索 C++解题报告 :[SCOI2005]骑士精神相关推荐

  1. P2324 [SCOI2005]骑士精神(迭代加深搜索,dfs)

    传送门 文章目录 解析 解析 很显然,让马走的话状态记录和转移都会比较复杂 所以转化成让空位跳会更好做一点 但这不是重点 初看本题,其实第一感觉是bfs 但是状态数理论上最差可以达到815,(当然基本 ...

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

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

  3. 算法复习——迭代加深搜索(骑士精神bzoj1085)

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

  4. BZOJ 1085 骑士精神 迭代加深搜索+A*

    题目链接: https://www.lydsy.com/JudgeOnline/problem.php?id=1085 题目大意: 在一个5×5的棋盘上有12个白色的骑士和12个黑色的骑士, 且有一个 ...

  5. hdu 1560 DNA sequence(迭代加深搜索)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1560 题意:从n个串中找出一个最短的公共串,,该公共串对于n个字符串不要求连续,即只要保持相对顺序就好 ...

  6. 搜索进阶之迭代加深搜索

    迭代加深搜索 首先这个不要怕这个东西,其实我刚开始学这个搜索也觉得特别高大上,觉得都是很高大上让人听不懂的专业术语,其实说白了迭代加深搜索的思想和精髓就是控制了搜索深度的dfs,但是却能够达到广搜的效 ...

  7. 紫书搜索 习题7-8 UVA - 12107 Digit Puzzle IDA*迭代加深搜索

    题目链接: https://vjudge.net/problem/UVA-12107 题意: 给出一个数字谜,要求修改尽量少的数,使修改后的数字谜只有唯一解.空格和数字可以随意替换,但不能增删,数字谜 ...

  8. UVA - 11214Guarding the Chessboard守卫棋盘(迭代加深搜索)

    题意:输入一个n*m棋盘(0<n,m<10),某些格子有标记.用最少的皇后守卫所有带标记的格子.皇后规则是所在坐标的直线和斜线都可以被守卫,长度不限. 分析:因为不知道深度,所以用迭代加深 ...

  9. 迭代加深搜索与埃及分数求解

    迭代加深搜索,实质上是限定下界的深度优先搜索.即首先允许深度优先搜索K层,若没有发现可行解,再将K+1后 重复以上步骤搜索,直到搜索到可行解. 在迭代加深搜索的算法中,连续的深度优先搜索被引入,每一个 ...

最新文章

  1. R可视化包ggplot2改变图例(Legend)的位置实战
  2. [Silverlight入门系列]使用MVVM模式(7):ViewModel的INotifyPropertyChanged接口实现
  3. IE请求json数据时出现下载文件的现象。
  4. mysql 导入日期 0000_解决Excel导入MySQL日期为0000-00-00
  5. jQuery:input的value值發生改變時,觸發事件
  6. Docker监控方案之cAdvisor
  7. ubuntu: root用户
  8. Ubuntu中eclipse端口被占
  9. 120 Python程序中的线程操作-队列
  10. 导出PDF /home/education/font/simsun.ttc not found as file or resource.
  11. YoungTalk-STM32入门100步-回顾总结与展望(98-100)
  12. PTA (特立独行的幸福)
  13. android原生支持机型,首发机型Find 7:OPPO发布原生Android系统
  14. web自动化测试-第一讲:selenium快速入门
  15. 微信小程序 view的文本自动换行了的问题(scroll-view)/微信小程序 view换行跟不换行的解决方案
  16. Futaba M11BT222A VFD(主控PT6311)STC51单片机驱动程序
  17. linux下反向解析文件的权限应该是什么,Linux 下的DNS服务器中,反向解析文件的内容包括( )...
  18. 2022.10.23 英语背诵
  19. CLI、CLR、CTS、CLS
  20. 【ARM】新唐NUC977移植WK2124驱动

热门文章

  1. django中的FBV和CBV
  2. runltp出现问题 [
  3. mysql遇到时区问题的坑(Java解决方案)
  4. Python学习教程:Python增强赋值及共享引用注意事项
  5. [BZOJ1497] [NOI2006]最大获利
  6. AliOS-Things Visual studio code helloworld 入门
  7. Alias Method解决随机类型概率问题(别名算法)
  8. 基于vue的UI框架集锦(移动端+pc端)
  9. java项目中Classpath路径到底指的是哪里?
  10. 监控系统的多协议直播(RTSP RTMP HTTP Live Streaming)