Codevs 四子连棋 (迭代加深搜索)
在一个4*4的棋盘上摆放了14颗棋子,其中有7颗白色棋子,7颗黑色棋子,有两个空白地带,任何一颗黑白棋子都可以向上下左右四个方向移动到相邻的空格,这叫行棋一步,黑白双方交替走棋,任意一方可以先走,如果某个时刻使得任意一种颜色的棋子形成四个一线(包括斜线),这样的状态为目标棋局。
| ● | ○ | ● | |
| ○ | ● | ○ | ● |
| ● | ○ | ● | ○ |
| ○ | ● | ○ |
从文件中读入一个4*4的初始棋局,黑棋子用B表示,白棋子用W表示,空格地带用O表示。
用最少的步数移动到目标棋局的步数。
BWBO
WBWB
BWBW
WBWO
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 四子连棋 (迭代加深搜索)的更多相关文章
- codevs 2541 幂运算(迭代加深搜索)
/* 一开始想到了简单的深搜 维护当前可用的mi数组 然后回溯用哪个 不断更新新产生的mi 这样的问题是 由于mi不断产生 搜索规模扩大 不好 不好 下面是奇丑的WA掉的代码 做个反面教材 */ #i ...
- P2346 四子连棋
P2346 四子连棋 迭代加深++ 题意描述 在一个4*4的棋盘上摆放了14颗棋子,其中有7颗白色棋子,7颗黑色棋子,有两个空白地带,任何一颗黑白棋子都可以向上下左右四个方向移动到相邻的空格,这叫行棋 ...
- 迭代加深搜索[codevs1004 四子连棋]
迭代加深搜索 一.算法简介 迭代加深搜索是在速度上接近广度优先搜索,空间上和深度优先搜索相当的搜索方式.由于在使用过程中引入了深度优先搜索,所以也可以当作深度优先搜索的优化方案. 迭代加深搜索适用于当 ...
- 【宽度优先搜索】神奇的状态压缩 CodeVs1004四子连棋
一.写在前面 其实这是一道大水题,而且还出在了数据最水的OJ上,所以实际上这题并没有什么难度.博主写这篇blog主要是想写下一个想法--状态压缩.状态压缩在记录.修改状态以及判重去重等方面有着极高的( ...
- 迭代加深搜索 codevs 2541 幂运算
codevs 2541 幂运算 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 钻石 Diamond 题目描述 Description 从m开始,我们只需要6次运算就可以计算出 ...
- Codevs p1004 四子连棋
四子连棋 题目描述 Description 在一个4*4的棋盘上摆放了14颗棋子,其中有7颗白色棋子,7颗黑色棋子,有两个空白地带,任何一颗黑白棋子都可以向 ...
- codevs 1004 四子连棋
1004 四子连棋 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 黄金 Gold 题目描述 Description 在一个4*4的棋盘上摆放了14颗棋子,其中有7颗白 ...
- codevs 1004 四子连棋 BFS、hash判重
004 四子连棋 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 黄金 Gold 题目描述 Description 在一个4*4的棋盘上摆放了14颗棋子,其中有7颗白色棋 ...
- 【洛谷 P2346】四子连棋(状态压缩,搜索)
其实这题可以直接二进制状压做,1表示黑棋,0表示白棋,另外记录下2个空点的位置就行了. 具体看代码(冗长): #include <iostream> #include <cstdio ...
随机推荐
- JS BOM 窗口中的使用
1,弹框的种类 2,打开一个新页面 子窗口操作父窗口,打开新窗口显示内容open("opener.html","haha","width=300,he ...
- SDUT-3375_数据结构实验之查找三:树的种类统计
数据结构实验之查找三:树的种类统计 Time Limit: 400 ms Memory Limit: 65536 KiB Problem Description 随着卫星成像技术的应用,自然资源研究机 ...
- Person Re-identification 系列论文笔记(八):SPReID
Human Semantic Parsing for Person Re-identification Kalayeh M M, Basaran E, Gokmen M, et al. Human S ...
- 获取登录的地点和ip地址的js
<script src="http://pv.sohu.com/cityjson?ie=utf-8"></script> <script>doc ...
- Pyhton 单行、多行注释方法
一.python单行注释的符号 井号#常被用作单行注释符号,在代码中使用#时,它右边的任何数据都会被忽略,当做是注释.类似c++的// 二.批量.多行注释的符号 多行注释是用三引号: ”’ 注释内容 ...
- matlab 单元最短路 Dijkstra算法 无向图
W = [2 8 1 1 6 5 1 2 3 6 4 9 3 7 9]; S = [0 0 0 1 1 3 3 3 5 5 6 4 6 2 2];S=S+1; T = [1 3 2 4 3 4 5 6 ...
- python ASCII编码集
- 原生js实现复制文本到粘贴板
项目中经常会遇到点击按钮复制订单号.订单id等内容到粘贴板中的需求.可是通常我们都是用Ctrl + c或右击复制的,别操心,js也是有复制命令的,那就是document.execCommand('co ...
- 实现ios后台缩略图模糊的一种方法
http://blog.sina.com.cn/s/blog_64cfe8f00102ux5t.html 今天玩手机(Iphone)发现应用切换支付宝会变模糊,不禁感叹,细节处理的太到位了. 怎么 ...
- @atcoder - AGC035E@ Develop
目录 @description@ @solution@ @accepted code@ @details@ @description@ 给定初始集合为 1 ~ N 的全集,并给定一个 K. 每次对于当 ...