迭代加深搜索

一、算法简介

  迭代加深搜索是在速度上接近广度优先搜索,空间上和深度优先搜索相当的搜索方式。由于在使用过程中引入了深度优先搜索,所以也可以当作深度优先搜索的优化方案。

  迭代加深搜索适用于当搜索深度没有明确上限的情况。

  例如上图的一棵搜索树,在进行深度优先搜索前先规定好这次搜索的最大深度dep,当搜索到达dep却还没搜索到结果时回溯。

  之后不断加大搜索深度,重新搜索,直到找到结果为止。虽然这样搜索次数会累计很多次,但每一次搜索的范围和下一次搜索的范围相比微不足道,所以整体搜索速度不会受太大影响。

  由于深度是从小到大逐渐增大的,所以当搜索到结果时可以保证搜索深度是最小的。这也是迭代加深搜索在一部分情况下可以代替广度优先搜索的原因(还比广搜省空间)。

二、算法图示

   假设G是需要搜索到的结果。

 

  

  当 dep = 1 时搜索深度为1,搜索到节点 A,未搜索到结果,dep++ 并进行下一次深搜。

  当 dep = 2 时搜索深度为2,搜索到节点 A,B,C,D 未搜索到结果,dep++ 并进行下一次深搜。

  当 dep = 3 时搜索深度为3,搜索到节点 A,B,C,D,E,G 搜索到结果G,停止全部搜索并记录记录结果。

三、[codevs 1004四子连棋]

  在一个4*4的棋盘上摆放了14颗棋子,其中有7颗白色棋子,7颗黑色棋子,有两个空白地带,任何一颗黑白棋子都可以向上下左右四个方向移动到相邻的空格,这叫行棋一步,黑白双方交替走棋,任意一方可以先走,如果某个时刻使得任意一种颜色的棋子形成四个一线(包括斜线),这样的状态为目标棋局。

● ○ ●  
○ ● ○ ●
● ○ ● ○
○ ● ○  

  一般这样找最小搜索深度的题都用广度优先搜索写,但是由于广搜空间占用多,于是我们可以用迭代加深搜索作替代品。

  本题迭搜思路就是逐渐增加每一次下棋的最大移动步数,当棋盘状态满足题目所给条件时退出并记录步数。

  下面贴AC程序

 #include <stdio.h>
#include <iostream>
#include <algorithm>
using namespace std;
int board[][];
int movex[]={,-,,,},movey[]={,,,,-};
int Ox1,Oy1,Ox2,Oy2,dep,f;
int avalible(int a,int b,int k){
if(board[a][b]!=k&&a>=&&a<=&&b>=&&b<=) return ;
else return ;
}
int jdg(){
for(int i=;i<=;i++){
if(board[i][]==board[i][]&&board[i][]==board[i][]&&board[i][]==board[i][]) return ;
if(board[][i]==board[][i]&&board[][i]==board[][i]&&board[][i]==board[][i]) return ;
}
if(board[][]==board[][]&&board[][]==board[][]&&board[][]==board[][]) return ;
if(board[][]==board[][]&&board[][]==board[][]&&board[][]==board[][]) return ;
return ;
}
void dfs(int x,int y,int p,int q,int pre,int step){
if(jdg()){
f=;
return ;
}
else if(step>dep) return ;
for(int i=;i<=;i++){
int nx=x+movex[i];
int ny=y+movey[i];
int np=p+movex[i];
int nq=q+movey[i]; if(avalible(nx,ny,pre)){
swap(board[x][y],board[nx][ny]); dfs(nx,ny,p,q,board[x][y],step+); swap(board[x][y],board[nx][ny]);
}
if(avalible(np,nq,pre)){
swap(board[p][q],board[np][nq]); dfs(x,y,np,nq,board[p][q],step+); swap(board[p][q],board[np][nq]);
}
}
}
int main(){
for(int i=;i<=;i++)
for(int j=;j<=;j++){
char ch;
cin>>ch;
if(ch=='B') board[i][j]=;
else if(ch=='W') board[i][j]=;
else board[i][j]=; if(board[i][j]==&&!Ox1) Ox1=i,Oy1=j;
else if(board[i][j]==) Ox2=i,Oy2=j;
}
for(dep=;;dep++){
dfs(Ox1,Oy1,Ox2,Oy2,,);
dfs(Ox1,Oy1,Ox2,Oy2,,);
if(f){
printf("%d",dep);
return ;
}
}
return ;
}

迭代加深搜索[codevs1004 四子连棋]的更多相关文章

  1. 【宽度优先搜索】神奇的状态压缩 CodeVs1004四子连棋

    一.写在前面 其实这是一道大水题,而且还出在了数据最水的OJ上,所以实际上这题并没有什么难度.博主写这篇blog主要是想写下一个想法--状态压缩.状态压缩在记录.修改状态以及判重去重等方面有着极高的( ...

  2. codevs1004四子连棋[BFS 哈希]

    1004 四子连棋   时间限制: 1 s   空间限制: 128000 KB   题目等级 : 黄金 Gold   题目描述 Description 在一个4*4的棋盘上摆放了14颗棋子,其中有7颗 ...

  3. codevs1004四子连棋

    1004 四子连棋  时间限制: 1 s  空间限制: 128000 KB  题目等级 : 黄金 Gold     题目描述 Description 在一个4*4的棋盘上摆放了14颗棋子,其中有7颗白 ...

  4. codevs1004 四子连棋

    题目描述 Description 在一个4*4的棋盘上摆放了14颗棋子,其中有7颗白色棋子,7颗黑色棋子,有两个空白地带,任何一颗黑白棋子都可以向上下左右四个方向移动到相邻的空格,这叫行棋一步,黑白双 ...

  5. Codevs 四子连棋 (迭代加深搜索)

    题目描述 Description 在一个4*4的棋盘上摆放了14颗棋子,其中有7颗白色棋子,7颗黑色棋子,有两个空白地带,任何一颗黑白棋子都可以向上下左右四个方向移动到相邻的空格,这叫行棋一步,黑白双 ...

  6. 【洛谷 P2346】四子连棋(状态压缩,搜索)

    其实这题可以直接二进制状压做,1表示黑棋,0表示白棋,另外记录下2个空点的位置就行了. 具体看代码(冗长): #include <iostream> #include <cstdio ...

  7. P2346 四子连棋

    P2346 四子连棋 迭代加深++ 题意描述 在一个4*4的棋盘上摆放了14颗棋子,其中有7颗白色棋子,7颗黑色棋子,有两个空白地带,任何一颗黑白棋子都可以向上下左右四个方向移动到相邻的空格,这叫行棋 ...

  8. POJ1129Channel Allocation[迭代加深搜索 四色定理]

    Channel Allocation Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 14601   Accepted: 74 ...

  9. UVA - 11214 Guarding the Chessboard(迭代加深搜索)

    题目: 输入一个n*m的棋盘(n,m<10),某些格子有标记,用最少的皇后守卫(即占据或攻击)所有的标记的格子.输出皇后的个数. 思路: 一开始没有想到用迭代加深搜索,直接dfs结果还没写完就发 ...

随机推荐

  1. Search Engine —— Regular Expression(Spider)

    Regular Expression,即正则表达式:用来查找符合某些负责规则的字符串的需要.它真是用于描述这些规则的工具. 1. \b 是一个元字符,用来匹配一个位置,代表着单词的开头或结尾,也就是单 ...

  2. Citrix NetScaler HA(高可用性)解析

    Citrix NetScaler HA(高可用性)解析 来源 https://www.iyunv.com/thread-172259-1-1.html 1.1     NetScaler高可用概述 我 ...

  3. [洛谷P3978][TJOI2015]概率论

    题目大意:对于一棵随机生成的$n$个结点的有根二叉树,所有不同构的形态等概率出现(这里同构当且仅当两棵二叉树根相同,并且相同节点的左儿子和右儿子都相同),求叶子节点个数的期望是多少? 题解:令$f_n ...

  4. 整数拆分 [dp+多项式插值]

    题意 $1 \leq n \leq 10^{18}$ $2 \leq m \leq 10^{18}$ $1 \leq k \leq 20$ 思路 n,m较小 首先考虑朴素的$k=1$问题: $f[i] ...

  5. xmlhelper类

    using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Xm ...

  6. 【IDEA】IDEA断点调试与清除断点

    有时候我们必须启动debug模式来进行调试,在IDEA中断点调试与Eclipse大致相同: 1.以debug模式启动服务器: 2.在需要打断点的那一行前面点击一下标记上红点则是有断点,再次点击可以清除 ...

  7. centos dhcp获取不到ip解决方法 Bringing up interface eth0: Device eth0 does not seem to be present,delaying initialization.

    1.删除文件: /etc/udev/rules.d/70-persistent-net.rules 2.编辑 /etc/sysconfig/network-scripts/ifcfg-eth0 删除H ...

  8. Python数据结构——栈

    栈是一种特殊的列表,栈内的元素只能通过列表的一端访问,这一端称为栈顶.栈被称为一种后入先出(LIFO,last-in-first-out)的数据结构. 由于栈具有后入先出的特点,所以任何不在栈顶的元素 ...

  9. ANDROID开发笔记(二)

    动机: 开发的一个背单词的软件. 不会实现划屏的特性. 方法: 第一步尝试: 在MainActivity中, 增加以下代码后, 如果在视图的空白处点击时, 文本框中的时间就会发生改变. @Overri ...

  10. OpenGL入门学习(七)(转)

    http://blog.chinaunix.net/uid-20622737-id-1912803.html 今天要讲的是OpenGL光照的基本知识.虽然内容显得有点多,但条理还算比较清晰,理解起来应 ...