题目描述 Description

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

 
 
输入描述 Input Description
从文件中读入一个4*4的初始棋局,黑棋子用B表示,白棋子用W表示,空格地带用O表示。
输出描述 Output Description

用最少的步数移动到目标棋局的步数。

样例输入 Sample Input

BWBO
WBWB
BWBW
WBWO

样例输出 Sample Output

5

思路:(迭代加深搜索是限制的搜索深度的深搜,可以用来求解大部分的广度优先搜索的题目,不过要确定好搜索的起点和终点)

    首先介绍一下迭代加深搜索:  迭代加深搜索就是在DFS时给定一个深度上限,当搜索深度超过上限时就不再拓展。从1开始枚举深度上限如果能找到解,这个上限就是最优解,否则就加大上限继续搜索。

    现在我们来看这道题:由于黑白两色需要轮流动棋,在搜索时还要记录上一手是哪个颜色的棋移动,判断时也要注意这一点,开始搜索时也要考虑黑先手和白先手两种情况所以DFS时需要存储的状态有:两个空格的坐标,上一手棋的颜色和当前的深度。然后只要想到棋的移动等于空格的移动这一点即可。

代码如下:

 #include<iostream>
#include<cstring> using namespace std;
int map[][];//棋盘
int ox1=,oy1=,ox2=,oy2=,dep;
bool flag=false;
int movex[]={,,,-,},movey[]={,,,,-};
bool ava(int x,int y,int pre)//判断下一步棋是否可以走
{
if(map[x][y]!=pre&&x>=&&x<=&&y>=&&y<=)
return true;
return false;
}
bool win()//判断是否走出了输赢
{
for(int i=;i<=;i++)//水平和垂直方向
{
if(map[i][]==map[i][]&&map[i][]==map[i][]&&map[i][]==map[i][])
return true;
if(map[][i]==map[][i]&&map[][i]==map[][i]&&map[][i]==map[][i])
return true;
}//以下是两个斜对角线
if(map[][]==map[][]&&map[][]==map[][]&&map[][]==map[][])
return true;
if(map[][]==map[][]&&map[][]==map[][]&&map[][]==map[][])
return true; return false;
} void iddfs(int x,int y,int p,int q,int pre,int step)//pre为棋盘的棋子类型,step为搜索深度即所走的步数
{
int nx,ny,qx,qy;
if(win())
{
flag=true;
return ;
}
else if(step>dep)//如果当前深度超过了限制的深度 就停止
return;
for(int i=;i<=;i++)
{
nx=x+movex[i];//分别向四个方向移动
ny=y+movey[i];
qx=p+movex[i];
qy=q+movey[i]; if(ava(nx,ny,pre))//以其中一个空格为起点
{
swap(map[x][y],map[nx][ny]);//交换空格和所移动的棋子
iddfs(nx,ny,p,q,map[x][y],step+);
swap(map[x][y],map[nx][ny]);
}
if(ava(qx,qy,pre))//以另一个空格为起点
{
swap(map[p][q],map[qx][qy]);
iddfs(x,y,qx,qy,map[p][q],step+);
swap(map[p][q],map[qx][qy]);
}
} } int main()
{
char s;
for(int i=;i<=;i++)//对输入的棋盘进行处理
for(int j=;j<=;j++)
{
cin>>s;
if(s=='B')
map[i][j]=;
else if(s=='W')
map[i][j]=;
else
{
map[i][j]=;
if(!ox1)
{
ox1=i;
oy1=j;
}
else
{
ox2=i;
oy2=j;
}
}
}
for(dep=;;dep++)//dep为搜索的限制程度
{
iddfs(ox1,oy1,ox2,oy2,,);
iddfs(ox1,oy1,ox2,oy2,,);
if(flag)
{
cout<<dep<<endl;
break;
}
}
return ;
}

Codevs 四子连棋 (迭代加深搜索)的更多相关文章

  1. codevs 2541 幂运算(迭代加深搜索)

    /* 一开始想到了简单的深搜 维护当前可用的mi数组 然后回溯用哪个 不断更新新产生的mi 这样的问题是 由于mi不断产生 搜索规模扩大 不好 不好 下面是奇丑的WA掉的代码 做个反面教材 */ #i ...

  2. P2346 四子连棋

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

  3. 迭代加深搜索[codevs1004 四子连棋]

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

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

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

  5. 迭代加深搜索 codevs 2541 幂运算

    codevs 2541 幂运算  时间限制: 1 s  空间限制: 128000 KB  题目等级 : 钻石 Diamond 题目描述 Description 从m开始,我们只需要6次运算就可以计算出 ...

  6. Codevs p1004 四子连棋

                          四子连棋 题目描述 Description 在一个4*4的棋盘上摆放了14颗棋子,其中有7颗白色棋子,7颗黑色棋子,有两个空白地带,任何一颗黑白棋子都可以向 ...

  7. codevs 1004 四子连棋

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

  8. codevs 1004 四子连棋 BFS、hash判重

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

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

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

随机推荐

  1. 【JZOJ3886】【长郡NOIP2014模拟10.22】道路维护

    CCC 最近徆多人投诉说C国的道路破损程度太大,以至亍无法通行 C国的政府徆重视这件事,但是最近财政有点紧,丌可能将所有的道路都进行维护,所以他们决定按照下述方案进行维护 将C国抽象成一个无向图,定义 ...

  2. python2与python3爬虫中get与post对比

    python2中的urllib2改为python3中的urllib.request 四种方式对比: python2的get: # coding=utf-8 import urllib import u ...

  3. MVC设计之MVC设计模式(介绍)

    mvc介绍; 首先先引用一个百度百科的介绍: MVC全名是Model View Controller,是模型(model)-视图(view)-控制器(controller)的缩写,一种软件设计典范,用 ...

  4. python 并发之进程

    一.什么是进程 进程(Process)是计算机中的程序关于某数据集合上的一次运行活动,是系统进行资源分配和调度的基本单位,是操作系统结构的基础.在早期面向进程设计的计算机结构中,进程是程序的基本执行实 ...

  5. jquery解析XML文件实现的省市联动

    XML我是直接在网上下载的文件包 拿过来用的 jquery我用的是3.1的 前台页面 <form action="buy.html" method="get&quo ...

  6. Vue CLI图形化创建项目

  7. [BZOJ3064][Tyvj1518] CPU监控

    题目:[BZOJ3064][Tyvj1518] CPU监控 思路: 线段树专题讲的.以下为讲课时的课件: 给出序列,要求查询一些区间的最大值.历史最大值,支持区间加.区间修改.序列长度和操作数< ...

  8. 解释型语言Python

  9. LeetCode81 Search in Rotated Sorted Array II

    题目: Follow up for "Search in Rotated Sorted Array":What if duplicates are allowed? Would t ...

  10. 使用jQuery的 autocomplete 实现输入框 自动提示补全

    参考网址: https://www.cnblogs.com/jinzhiming/p/6768402.html 插件下载地址: 链接:https://pan.baidu.com/s/1SpP3hixZ ...