http://blog.csdn.net/u013598409/article/details/43924465

相比于一年半前,代码的掌控能力强了许多。

#include <cstdio>
#include <algorithm>
#include <map>
using namespace std;

#define rep(i,a,b) for (int i=(a);i<=(b);i++)
#define per(i,a,b) for (int i=(a);i>=(b);i--)

const int dx[4]={0,0,-1,1};
const int dy[4]={-1,1,0,0};

char s[4][4];

int dep;
map<int,int> mp;

inline int cid(char c)
{
    if (c=='W') return 0;
    else if (c=='B') return 1;
    else if (c=='O') return 2;
}

inline int ST(void)
{
    int sum=0;
    rep(i,0,3)
        rep(j,0,3)
            sum=sum*3+cid(s[i][j]);
    return sum;
}

inline int Check(void)
{
    char t;
    rep(i,0,3)
    {
        t=s[i][0];
        if (t==s[i][1]&&t==s[i][2]&&t==s[i][3]) return 1;
    }

    rep(i,0,3)
    {
        t=s[0][i];
        if (t==s[1][i]&&t==s[2][i]&&t==s[3][i]) return 1;
    }

    t=s[0][0];
    if (t==s[1][1]&&t==s[2][2]&&t==s[3][3]) return 1;

    t=s[3][0];
    if (t==s[2][1]&&t==s[1][2]&&t==s[0][3]) return 1;

    return 0;
}

inline int Legal(int x,int y)
{
    return 0<=x&&x<=3&&0<=y&&y<=3;
}

int DFS(int dir,int tms,int lim)
{
    int st=ST();
    if (mp.count(st)) return 0;
    mp[st]=1;

    if (tms==lim)
    {
        int t=Check();
        return t;
    }

    rep(x,0,3) rep(y,0,3) if (cid(s[x][y])==dir)
        rep(k,0,3)
        {
            int nx=x+dx[k],ny=y+dy[k];
            if (Legal(nx,ny)&&cid(s[nx][ny])==2)
            {
                swap(s[x][y],s[nx][ny]);
                int t=DFS(dir^1,tms+1,lim);
                swap(s[x][y],s[nx][ny]);
                if (t) return 1;
            }
        }
    return 0;
}

int main(void)
{
//  freopen("codevs1004.in","r",stdin);
//  freopen("codevs1004.out","w",stdout);

    rep(i,0,3)
        scanf("%s",s[i]);

    int t1,t2; dep=-1;
    do
    {
        dep++;
        mp.clear();
        t1=DFS(0,0,dep);
        mp.clear();
        t2=DFS(1,0,dep);
    }while (!t1&&!t2);
    printf("%d\n",dep);

    return 0;
}

【CodeVS 1004】四子连棋的更多相关文章

  1. codevs 1004 四子连棋

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

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

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

  3. CODEVS 1004四子连棋

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

  4. Codevs p1004 四子连棋

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

  5. CODEVS——T 1004 四子连棋

    http://codevs.cn/problem/1004/  时间限制: 1 s  空间限制: 128000 KB  题目等级 : 黄金 Gold 题解  查看运行结果     题目描述 Descr ...

  6. BFS搜索算法应用_Codevs 1004 四子连棋

    #define _CRT_SECURE_NO_WARNINGS #include <iostream> #include <algorithm> #include <cs ...

  7. 【wikioi】1004 四子连棋

    题目链接 算法:BFS //2014-02-05更新 *******************************2013-10-15******************************* ...

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

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

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

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

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

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

随机推荐

  1. Struts2的标签库(三)——控制标签

    Struts2的标签库(三) --控制标签 1.if/elseif/else标签 用于分支控制,取代JSP中的if语句,根据一个boolean(test属性的值)值判断是否进行下一步运算或者输出等. ...

  2. 通过继承Rect类编写一个具有确定位置的矩形类PlainRect,其确定位置用 矩形的左上角坐标来标识,包含: 添加两个属性:矩形左上角坐标startX和startY。 两个构造方法: 带4个参数的构造方法,用于对startX、startY、width和height属性 初始化; 不带参数的构造方法,将矩形初始化为左上角坐标、长和宽都为0 的矩形; 添加一个方法: 判断某个点是否在矩形内部的方法

    package b; public class Rect { Double width; Double height; public Double getWidth() { return width; ...

  3. Linux安装配置JDK

    如果想看Windows下的安装,请访问此链接: http://www.cnblogs.com/yoyotl/p/5101321.html 1. 去官网下载Linux版本的jdk安装包,(我下载的是ta ...

  4. 查看博客模板的css代码

    1.可以去模板列表里选择一个模板 http://www.cnblogs.com/Skins.aspx 目前使用的模板是http://www.cnblogs.com/SkinUser.aspx?Skin ...

  5. hihoCoder太阁最新面经算法竞赛17

    比赛链接:http://hihocoder.com/contest/hihointerview26 A.排序后枚举两个点,确定一个矩形后二分剩下两个点. #include <bits/stdc+ ...

  6. Linux链接库四(多个库文件链接顺序问题)

    最近在Linux下编程发现一个诡异的现象,就是在链接一个静态库的时候总是报错,类似下面这样的错误: (.text+0x13): undefined reference to `func' 关于unde ...

  7. MyBatis 动态SQL查询,多条件,分页

    <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE mapper PUBLIC "-/ ...

  8. XML约束——DTD约束

    参考: 方立勋老师的讲课视频.   什么是XML约束 •在XML技术里,可以编写一个文档来约束一个XML文档的书写规范,这称之为XML约束. 为什么需要XML约束 常用的约束技术 •XML DTD • ...

  9. C语言单链表实现19个功能完全详解

    谢谢Lee.Kevin分享了这篇文章 最近在复习数据结构,想把数据结构里面涉及的都自己实现一下,完全是用C语言实现的. 自己编写的不是很好,大家可以参考,有错误希望帮忙指正,现在正处于编写阶段,一共将 ...

  10. iOS - NetRequest 网络数据请求

    1.网络请求 1.1 网络通讯三要素 1.IP 地址(主机名): 网络中设备的唯一标示.不易记忆,可以用主机名(域名). 1) IP V4: 0~255.0~255.0~255.0~255 ,共有 2 ...