/*
数据范围太小 暴力暴力 Dfs直接
终止条件嘛 就是4中目标棋局 挨着枚举一遍就好了
搜索的起点一定是空格 当然 空格周围有黑有白 黑先走或者白先走答案可能不一样
所以 维护一个b 表示这一步走那种颜色 b=1先走白棋 b=2先走黑棋 */
#include<iostream>
#include<cstring>
#include<cstdio>
using namespace std;
int xx[]={,,,,-};//枚举四个方向
int yy[]={,,-,,};
int g[][],minn=;//最小步数
char s;
void Dfs(int x,int y,int num,int b)//b表示 先走那种颜色
{
int m=,i,j,k;
if(num>=minn) return; //剪枝 如果已经比目前的最优解大了 就不用再Dfs了
for(i=;i<=;i++)//4种目标棋局一一列举 如果有符合的 更新m的值
{
if(g[i][]==g[i][]&&g[i][]==g[i][]&&g[i][]==g[i][]&&(g[i][]==||g[i][]==))m=num;
if(g[][i]==g[][i]&&g[][i]==g[][i]&&g[][i]==g[][i]&&(g[][i]==||g[][i]==))m=num;
}
if(g[][]==g[][]&&g[][]==g[][]&&g[][]==g[][]&&(g[][]==||g[][]==))m=num;
if(g[][]==g[][]&&g[][]==g[][]&&g[][]==g[][]&&(g[][]==||g[][]==))m=num;
if(m<minn)//用m更新minn
{
minn=m;
return;//不用往后Dfs了 因为后面不如现在优
}
for(i=;i<=;i++)
{
int ox=x+xx[i];
int oy=y+yy[i];
if(ox>&&ox<=&&oy>&&oy<=&&g[ox][oy]==b)
{
g[x][y]=g[ox][oy];
g[ox][oy]=;//走完之后g[ox][oy]变空 g[x][y]变g[ox][oy]
if(b==)b=;//黑白交替走 上次走黑 下次走白
else b=;
for(j=;j<=;j++)//因为空格又不止一个 所以 找空格0.0
for(k=;k<=;k++)
if(!g[j][k])//空
Dfs(j,k,num+,b);
g[ox][oy]=g[x][y];//回溯
g[x][y]=;
if(b==)b=;
else b=;
}
}
}
int main()
{
int i,j;
for(i=;i<=;i++)
for(j=;j<=;j++)
{
cin>>s;
if(s=='W')g[i][j]=;//白棋
if(s=='B')g[i][j]=;//黑棋
}
for(i=;i<=;i++)
for(j=;j<=;j++)
if(!g[i][j])//空格
{
Dfs(i,j,,);//先走白棋
Dfs(i,j,,);//先走黑棋
}
cout<<minn<<endl;
return ;
}

codevs1044四子连棋(Dfs)的更多相关文章

  1. codevs 1004 四子连棋

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

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

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

  3. codevs1004四子连棋

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

  4. P2346 四子连棋

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

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

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

  6. Codevs p1004 四子连棋

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

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

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

  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. C# ERP开发框架

    C/S系统开发框架-企业版 V4.0 (Enterprise Edition) 简介: http://www.csframework.com/cs-framework-4.0.htm 视频下载: 百度 ...

  2. Execl DataTime Format Number

    Excel 中日期类型所保存的值是数值型.只是设置了为日期格式,通过公式转换从而得出我们平时常用的日期内容.也很好理解这公式所要说明的意思.数值是个浮点型可以分成2部分看.整数部分:年月日(日期)小数 ...

  3. Mvc controller单元测试 Mock Url对象

    被测试Action 包含有Url对象的代码: data = new data { title = ds.Name, icon = "folder", attr = new { id ...

  4. java分页查询

    很多数据库自身都提供了分页机制,如SQL Server中提供的top关键字,MySQL数据库中提供的limit关键字,它们都可以设置数据返回的记录数. 通过各种数据库的分页机制实现分页查询,其优点是减 ...

  5. Solr4.8.0源码分析(24)之SolrCloud的Recovery策略(五)

    Solr4.8.0源码分析(24)之SolrCloud的Recovery策略(五) 题记:关于SolrCloud的Recovery策略已经写了四篇了,这篇应该是系统介绍Recovery策略的最后一篇了 ...

  6. GNU FORK PTHREAD SIGNALS

    Linux程序设计入门 - fork, pthread, and signals 在UNIX程序设计中,学会fork及signal的运用,算是相当基本的功夫. fork()及signal经常运用在da ...

  7. C#程序设计基础——运算符与表达式

    运算符就是完成操作的一系列符号,它主要包括算术运算符.赋值运算符.关系运算符.逻辑运算符.条件运算.位操作运算符和字符串运算符. 表达式就是运算符和操作数的组合,如a*b+1-c.表达式主要包括算术表 ...

  8. 【HDOJ】2699 Five in a Row

    wa了几次,至少要考虑4个方向:下.右.左下.右下.很像当年北航的机试题目. /* 2699 */ #include <iostream> #include <cstdio> ...

  9. <未测>源码升级安装glibc和rpm升级glibc

    源码升级安装glibc和rpm升级glibc http://jacklin9.spaces.live.com/blog/cns!A891B52E1182AFB2!346.entry http://bl ...

  10. Linux下高并发网络编程

      Linux下高并发网络编程 1.修改用户进程可打开文件数限制 在Linux平台上,无论编写客户端程序还是服务端程序,在进行高并发TCP连接处理时, 最高的并发数量都要受到系统对用户单一进程同时可打 ...