题目:10422 - Knights in FEN

题目大意:5 * 5的棋盘上摆好了旗子,旗子是按照马走日的规则来的,问能在十步之内将起始的棋盘变成题目所给的棋盘那样吗?可以输出最少步数,不可以就输出不行。

解题思路:这题之前我是想着用bfs,但是那个时候判重的时候没有想到用STL的map,用哈希不太会,直接开数组判重又太大了,用map<string, int>来记录一个棋盘的状态(之前没有想到),后来看了别人的代码,发现可以用迭代dfs,因为这题只需要判断十步内的情况,这样题目所给的时间还算是有余的,因为迭代dfs()比广搜要慢。

思路是:每次限定一个深度来进行深搜,这样就不会死循环,并且这个深度就是要求的步数。每限制一个深度就需要重头开始搜索一遍,这样比较花时间。但是节约了空间。这题的马只能跳到空格上,所以就重空格开始,按照规则构造棋盘,注意每次返回的时候都要返回原来的那个状态。这里代码里还参照了别人的剪枝的思想,提前判断一下现在这个状态要到达目标状态最少还要走多少步,如果现在的步数加上还要走的步数超过限定的深度,就可以直接返回了。还有要注意可以不移动就到达目标状态的情况。

#include<stdio.h>
#include<string.h>const int M = 5;
int t, deep;
char finish[M][M];
const char init[M][M] = {{'1', '1', '1', '1', '1'},{'0', '1', '1', '1', '1'},{'0', '0', ' ', '1', '1'},{'0', '0', '0', '0', '1'},{'0', '0', '0', '0', '0'}};
const int dx[] = {-2, -1, 1, 2, 2, 1, -1, -2};
const int dy[] = {-1, -2, -2, -1, 1, 2, 2, 1};int cut() {int sum = 0;for(int i =0; i < M; i++)for(int j = 0; j < M; j++)sum += (finish[i][j] != init[i][j]);return sum / 2;
}int dfs(int d, int x, int y) {if(d > deep)return 0;if(memcmp(finish, init, sizeof(init)) == 0)return 1;if(d + cut() > deep)return 0;for(int i = 0; i < 8; i++){int nx = x + dx[i];int ny = y + dy[i];if(nx >= 0 && nx < M && ny >= 0 && ny < M){int swap;swap = finish[x][y];finish[x][y] = finish[nx][ny];finish[nx][ny] = swap;if(dfs(d + 1, nx, ny))return 1;else{swap = finish[x][y];finish[x][y] = finish[nx][ny];finish[nx][ny] = swap;}}}return 0;
}int main(){scanf("%d%*c", &t);while(t--){int i, j, x, y;for(i = 0; i < M; i++){for(j = 0; j < M; j++){scanf("%c", &finish[i][j]);if(finish[i][j] == ' '){x = i;y = j;}}getchar();}for(deep = 0; deep < 11; deep++)if(dfs(0, x, y))break;if(deep != 11)printf("Solvable in %d move(s).\n", deep);elseprintf("Unsolvable in less than 11 move(s).\n");}return 0;
}

10422 - Knights in FEN(迭代深度搜索)相关推荐

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

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

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

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

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

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

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

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

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

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

  6. 埃及分数问题+迭代加深搜索

    理论上可以用回溯法求解,但是解答树非常恐怖,其一深度没有明显上限,1/i的值似乎可以在枚举不断更大的i时越来越小:其二加数的选择在理论上无限制. 解决方案采用迭代加深搜索:从小到大枚举深度上限maxd ...

  7. 深度搜索处理问题的关键 --- 做leetcode深度搜索类题目小结

    1.深度优先搜索中的关键 2.深度优先搜索小结 3.深度优先搜索和回溯法的区别 4.深度优先搜索与递归的区别 1.深度优先搜索中的关键 深度搜索算法通常用来 解决 全排列,不重复组合,分组问题,多条路 ...

  8. hud 1560 DNA sequence(IDA* 迭代加深搜索+估值函数)

    传送门 题目: Problem Description The twenty-first century is a biology-technology developing century. We ...

  9. 广度搜索与深度搜索的区别

    广度搜索(Breadth-First Search,BFS)是一种基于图的遍历算法,它按照广度优先的方式遍历图中的所有节点.具体来说,该算法从起点开始向外扩展,先遍历起点所有直接相邻的节点,然后再遍历 ...

最新文章

  1. python基本输入输出代码示例
  2. 软件使用说明书模板_想要快速定制表单模板?请收下这份浩辰3D设计攻略
  3. SQL Server 替换一个字段的特定字符
  4. boost::mpl模块实现reverse相关的测试程序
  5. 如何提问问题?--《提问的智慧》再次推荐
  6. 【MySQL】如何让数据库查询区分大小写
  7. oracle 之 安装10.2.0.1 且 升级到 10.2.0.4
  8. 使用Flowable.generate()生成可感知背压的流– RxJava常见问题解答
  9. 会议交流 | IJCKG 2021 日程表(北京时间)
  10. 阿里巴巴1682亿背后的“企业级”高效持续交付
  11. Java 读取txt文件,读取结果保存到数据库
  12. php实现加密解密,php实现加密与解密的原理与用法
  13. Mac: Failed to connect to raw.githubusercontent.com port 443: Connection refused error:
  14. 使用DuckDuckGo在命令行中搜索
  15. 树莓派可以搜索到wifi但是连接不上的问题解决方法
  16. python——利用记忆曲线制作单词计划表
  17. [创业] 让创业者惊讶的19个真相
  18. python语音特征提取_使用Python从视频中提取语音
  19. 机器学习笔记之朴素贝叶斯分类算法
  20. CentOS7中使用yum安装php5.6的方法

热门文章

  1. 网络安全--边界安全(1)
  2. Ubuntu命令行scp学习
  3. 狂奔的蔚来:上市背后的必然与隐忧
  4. 新代系统怎样看服务器ip,新代10M系统操机教程
  5. Springboot+Redis 实现API接口限流
  6. ​深度学习-关于图像分类的经典10篇文章
  7. 忘了微信密码怎么办_我的微信忘记密码怎么找回
  8. labview和c语言,到底哪个更好:LabVIEW还是C语言?
  9. 电脑版fl studio水果音乐编曲软件 v20.8新中文版
  10. BGP路由器协议排错教程:BGP 基本配置