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. OS开发(Objective-C)常用库索引

    code4app.com 这网站不错,收集各种 iOS App 开发可以用到的代码示例 cocoacontrols.com/ 英文版本的lib收集 objclibs.com/ 精品lib的收集网站 h ...

  2. Ubuntu安装后的一些配置

    对新安装的Ubuntu的一些配置: #移除无用包 apt-get remove libreoffice-common apt-get remove unity-webapps-common apt-g ...

  3. 获取指定的系统路径 SHGetSpecialFolderPath

    1.获取桌面的系统路径 TCHAR szLink[MAX_PATH + ] = { }; SHGetSpecialFolderPath(,szLink,CSIDL_DESKTOPDIRECTORY,) ...

  4. CodeForces 651B Beautiful Paintings 贪心

    A. Joysticks time limit per test 1 second memory limit per test 256 megabytes input standard input o ...

  5. Create Stacked Canvas to Scroll Horizontal Tabular Data Blocks In Oracle Forms

    In this tutorial you will learn to create horizontal scrollable tabular or detail data block by usin ...

  6. XSS技巧综合

    这周六会在公司分享经验和技巧,把自己的和网上的一些技巧来综合写一些,方便大家和自己: 普通的XSS,储存,反射,DOM 形成的无外乎就是输出点在html标签之间,html属性之间,成为JS代码,称为C ...

  7. poj 2954 Triangle(Pick定理)

    链接:http://poj.org/problem?id=2954 Triangle Time Limit: 1000MS   Memory Limit: 65536K Total Submissio ...

  8. Linux基础※※※※访问Windows共享文件夹

    参考Linux公社链接:http://www.linuxidc.com/Linux/2014-06/103749.htm 实际上,可以直接用sambaclient程序访问共享资源. 列出共享主机的列表 ...

  9. POJ1088滑雪(记忆化搜索+DFS||经典的动态规划)

      Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 84297   Accepted: 31558 Description M ...

  10. T-SQL JOIN

    a表name sex张三 男李四 女 b表name age李四 30王五 23 1 全外连接select a.name,a.sex,b.name,b.agefrom a full outer join ...