题目地址

方法是建立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-四子连棋的更多相关文章

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

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

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

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

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

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

  4. codevs1004四子连棋

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

  5. codevs1004 四子连棋

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

  6. codevs 1004 四子连棋

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

  7. P2346 四子连棋

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

  8. Codevs p1004 四子连棋

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

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

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

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

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

随机推荐

  1. spring使用elasticsearch 5.x

    elasticsearch客户端选择 这里使用transport建立elasticsearch客户端 applicationContext.xml配置,属性可以采用读取属性文件的方式.参考类Prope ...

  2. :selected

    描述: 查找所有选中的选项元素 HTML 代码: <select> <option value="1">Flowers</option> < ...

  3. HTML5、CSS3响应式设计——笔记

    1.1.响应式网页设计 响应式网页设计(RWD,Responsive Web Design)这个术语,由伊桑·马科特(EthanMarcotte)提出.他在A List Apart 发表了一篇开创性的 ...

  4. MySQL and Postgres command equivalents (mysql vs psql)

    MySQL and Postgres command equivalents (mysql vs psql) 博客分类: Database   From: http://blog.endpoint.c ...

  5. http接口测试——Jmeter接口测试实例讲解

    摘要: 最近做的项目需要测试很多接口,上网查一查,发现完整讲述接口测试的资料太少,所以最近自己做完这个项目,把测试的东西整理一下和大家分享一下,希望对看到的人有所帮助     一.测试需求描述 1. ...

  6. 覆盖的面积(HDU 1255 线段树)

    覆盖的面积 Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Problem D ...

  7. 模拟jquery

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...

  8. 初学画布canvas的chapter2

    文本 1.字体属性 context.font = [css font property] ——使用CSS规范,语法跟CSS字体速记符号一致 ——line-height无效,并永远忽略 Context. ...

  9. Java开发中经典的小实例-(随机产生验证码)

    import java.util.Scanner;public class Test10 {    public static void main(String[] args) {        // ...

  10. implicit operator

    class Digit { public Digit(double d) { val = d; } public double val; // ...other members // User-def ...