(DFS)codevs1004-四子连棋
方法是建立dfs,并在其中加入pre变量,记录之前移动的是W还是B。外面套for循环,从1步开始逐次递增,直到在i步时可以走完(dfs返回1),break退出循环,即为最短步。
本题的关键主要是可能有走过来又走回去的无用情况。对于这道题,即使在最坏的情况,也基本上可以保证在15步以内(并未证明)达到目标状态,所以可以在dfs中加入step进行限制,step等于外面for循环中的循环变量时就结束。这样就有效避免了死循环的出现,对于处理这道题的情况比较方便。
注:以下代码未考虑起始时就满足条件的情况。
#include <cstdio>
#include <iostream>
#include <cstring>
using namespace std;
char a[][];
int dir[][]={{,},{,-},{,},{-,}},ans,ox1=-,ox2,oy1,oy2;//dir数组储存方向,ox\oy记录两个空位
bool check()//检验此时棋盘是否满足条件
{
if(a[][]==a[][]&&a[][]==a[][]&&a[][]==a[][])
return true;
if(a[][]==a[][]&&a[][]==a[][]&&a[][]==a[][])
return ;
for(int i=;i<;i++)
{
if(a[i][]==a[i][]&&a[i][]==a[i][]&&a[i][]==a[i][])
return ;
if(a[][i]==a[][i]&&a[][i]==a[][i]&&a[][i]==a[][i])
return ;
}
return ;
}
bool val(int x,int y,char p)//检验位置是否合法
{
return x>=&&x<&&y>=&&y<&&a[x][y]!=p;
}
bool dfs(int x1,int y1,int x2,int y2,char pre,int step)
{
if(step==ans)
{
if(check()) return ;
else return false;
}
for(int i=;i<;i++)
{
int xn,yn,xm,ym;
xn=x1+dir[i][];
xm=x2+dir[i][];
yn=y1+dir[i][];
ym=y2+dir[i][];
if(val(xn,yn,pre))
{
swap(a[x1][y1],a[xn][yn]);
if(dfs(xn,yn,x2,y2,(pre=='B'?'W':'B'),step+))return ;//灵活运用三元运算符
swap(a[x1][y1],a[xn][yn]);
}
if(val(xm,ym,pre))
{
swap(a[x2][y2],a[xm][ym]);
if(dfs(x1,y1,xm,ym,(pre=='B'?'W':'B'),step+))return ;
swap(a[x2][y2],a[xm][ym]);
}
}
return ;
}
int main()
{
int i,x=,j;
for(i=;i<;i++)
scanf("%s",a[i]);
for(i=;i<;i++)
{
for(j=;j<;j++)
{
if(a[i][j]=='O')
{
if(ox1==-)
{
ox1=i;oy1=j;
}
else
{ox2=i;oy2=j;}
}
}
}
for(ans=;ans<;ans++)//从第一步开始逐次进行
{
if(dfs(ox1,oy1,ox2,oy2,'W',))
break;
if(dfs(ox1,oy1,ox2,oy2,'B',))
break;
}
printf("%d\n",ans);
return ;
}
(DFS)codevs1004-四子连棋的更多相关文章
- 【宽度优先搜索】神奇的状态压缩 CodeVs1004四子连棋
一.写在前面 其实这是一道大水题,而且还出在了数据最水的OJ上,所以实际上这题并没有什么难度.博主写这篇blog主要是想写下一个想法--状态压缩.状态压缩在记录.修改状态以及判重去重等方面有着极高的( ...
- codevs1004四子连棋[BFS 哈希]
1004 四子连棋 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 黄金 Gold 题目描述 Description 在一个4*4的棋盘上摆放了14颗棋子,其中有7颗 ...
- 迭代加深搜索[codevs1004 四子连棋]
迭代加深搜索 一.算法简介 迭代加深搜索是在速度上接近广度优先搜索,空间上和深度优先搜索相当的搜索方式.由于在使用过程中引入了深度优先搜索,所以也可以当作深度优先搜索的优化方案. 迭代加深搜索适用于当 ...
- codevs1004四子连棋
1004 四子连棋 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 黄金 Gold 题目描述 Description 在一个4*4的棋盘上摆放了14颗棋子,其中有7颗白 ...
- codevs1004 四子连棋
题目描述 Description 在一个4*4的棋盘上摆放了14颗棋子,其中有7颗白色棋子,7颗黑色棋子,有两个空白地带,任何一颗黑白棋子都可以向上下左右四个方向移动到相邻的空格,这叫行棋一步,黑白双 ...
- codevs 1004 四子连棋
1004 四子连棋 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 黄金 Gold 题目描述 Description 在一个4*4的棋盘上摆放了14颗棋子,其中有7颗白 ...
- P2346 四子连棋
P2346 四子连棋 迭代加深++ 题意描述 在一个4*4的棋盘上摆放了14颗棋子,其中有7颗白色棋子,7颗黑色棋子,有两个空白地带,任何一颗黑白棋子都可以向上下左右四个方向移动到相邻的空格,这叫行棋 ...
- Codevs p1004 四子连棋
四子连棋 题目描述 Description 在一个4*4的棋盘上摆放了14颗棋子,其中有7颗白色棋子,7颗黑色棋子,有两个空白地带,任何一颗黑白棋子都可以向 ...
- codevs 1004 四子连棋 BFS、hash判重
004 四子连棋 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 黄金 Gold 题目描述 Description 在一个4*4的棋盘上摆放了14颗棋子,其中有7颗白色棋 ...
- 【洛谷 P2346】四子连棋(状态压缩,搜索)
其实这题可以直接二进制状压做,1表示黑棋,0表示白棋,另外记录下2个空点的位置就行了. 具体看代码(冗长): #include <iostream> #include <cstdio ...
随机推荐
- java 除法向上,向下取整
向上取整用Math.ceil(double a) 向下取整用Math.floor(double a) // 举例: double a=35; double b=20; double c = a/b; ...
- vsftpd.conf 怎么保存
引用:http://zhidao.baidu.com/question/169939742.html vsftpd.conf 用vim编辑后如何保存?网上很多我都看了 esc 然后shift+ 不好使 ...
- 微信中修改title
//需要jQuery.zepto版 function weixinTitle(){ var $body = $('body'); document.title = 'title'; // hack在微 ...
- oracle 面试题
1.对数据库SQL2005.ORACLE熟悉吗? SQL2005是微软公司的数据库产品.是一个RDBMS数据库,一般应用在一些中型数据库的应用,不能跨平台. ORACLE是ORACLE公司的数 ...
- jquery判断起止时间大小和非空
//时间判断 function CheckDate() { var startTime = $('#txtTime').val(); //获取当前日期 var start = new Date(sta ...
- SQL2005中的事务与锁定(七) - 转载
------------------------------------------------------------------------ -- Author : HappyFlyStone - ...
- 30分钟LINQ教程
在说LINQ之前必须先说说几个重要的C#语言特性 一:与LINQ有关的语言特性 1.隐式类型 (1)源起 在隐式类型出现之前, 我们在声明一个变量的时候, 总是要为一个变量指定他的类型 甚至在fore ...
- 2015弱校联盟(1) -A. Easy Math
A. Easy Math Time Limit: 2000ms Memory Limit: 65536KB Given n integers a1,a2,-,an, check if the sum ...
- AtCoder Beginner Contest 050 ABC题
A - Addition and Subtraction Easy Time limit : 2sec / Memory limit : 256MB Score : 100 points Proble ...
- 19.fastDFS集群理解+搭建笔记
软件架构理解 1FastDFS介绍 1.1什么是FastDFS FastDFS是用c语言编写的一款开源的分布式文件系统.FastDFS为互联网量身定制,充分考虑了冗余备份.负载均衡.线性扩容等机制,并 ...