题目地址

方法是建立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. 手机触摸touch事件

    1.Touch事件简介 pc上的web页面鼠 标会产生onmousedown.onmouseup.onmouseout.onmouseover.onmousemove的事件,但是在移动终端如 ipho ...

  2. [ubuntu]给ubuntu server安装xubuntu(xfce)窗口管理器

    1.安装基本图形 $ sudo apt-get install x-window-system-core 2.安装窗口管理器 $ sudo apt-get install xubuntu-deskto ...

  3. iconfont-矢量图标字体的运用

    发现一个奇怪的现象:(http://m.muzhiwan.com) 这里面的图标竟然不是一张张小图标图片?Firebug下查看一下元素,竟然是这样的: 页面源代码如下: 好奇怪啊,这些个乱七八糟的&a ...

  4. CSS中的浮动问题

    有关于我们经常做的导航问题.我们如果想用ul>li来做导航的话,我是一般是用到浮动这个属性的. 也就是 float:left; 或者是 display:inline-block;  下边代码: ...

  5. Sharepoint2013切换用户菜单

          Sharepoint2013中没有切换用户的菜单,每次登录后,浏览器就会记住密码.要重新换一个用户登录的时候,就需要把浏览器都关闭,然后重新启动.这样非常不方便.特别是在测试权限这一块的时 ...

  6. centos7 docker tomcat7

    docker run --name=tomcat7_tmp -ti centos7/jdk7 /bin/bash cd /home wget http://apache.fayea.com/tomca ...

  7. Web API开发实例——对产品Product进行增删改查

    1.WebApi是什么 ASP.NET Web API 是一种框架,用于轻松构建可以由多种客户端(包括浏览器和移动设备)访问的 HTTP 服务.ASP.NET Web API 是一种用于在 .NET ...

  8. 利用反射和ResultSetMetaData实现DBUtils的基本功能

    DBUtils大大简化了JDBC的书写,极大的提高了开发效率,和数据库连接池一起,简化了JDBC开发的流程.简易的自定义数据库连接池可以通过装饰者设计模式和动态代理模式得到很简单的实现,那么DBUti ...

  9. js 仿phptrim

    function trims(){ this.init = function(myarguments){ if(arguments.length===0){return false;} this.ar ...

  10. 20161025__Oracle10g双机备份

    1.主要流程,参考: 完整 Oracle10G DataGuard安装文档_百度文库.html http://wenku.baidu.com/link?url=8A7nJGSwRu-83mxEIqGE ...