004 四子连棋

时间限制: 1 s
空间限制: 128000 KB
题目等级 : 黄金 Gold
 
 
 
题目描述 Description

在一个4*4的棋盘上摆放了14颗棋子,其中有7颗白色棋子,7颗黑色棋子,有两个空白地带,任何一颗黑白棋子都可以向上下左右四个方向移动到相邻的空格,这叫行棋一步,黑白双方交替走棋,任意一方可以先走,如果某个时刻使得任意一种颜色的棋子形成四个一线(包括斜线),这样的状态为目标棋局。

 
 
输入描述 Input Description
从文件中读入一个4*4的初始棋局,黑棋子用B表示,白棋子用W表示,空格地带用O表示。
输出描述 Output Description

用最少的步数移动到目标棋局的步数。

样例输入 Sample Input

BWBO
WBWB
BWBW
WBWO

样例输出
Sample Output

5

数据范围及提示
Data Size & Hint

hi

 
 
#include<iostream>
using namespace std;
struct data{
int mp[][];//1白棋,2黑棋,0空格
}d[];
int next[]={,};//下一步走黑棋还是白棋,1为白,2为黑
int step[];
bool hash[];
int xx[]={,,,-},yy[]={,-,,};
int t=,w=,flag=;
bool equ(int a1,int a2,int a3,int a4){if(a1!=a2||a2!=a3||a3!=a4||a4!=a1)return ;return ;}
bool check(){
for(int i=;i<=;i++)
{
if(equ(d[w].mp[i][],d[w].mp[i][],d[w].mp[i][],d[w].mp[i][]))return ;
if(equ(d[w].mp[][i],d[w].mp[][i],d[w].mp[][i],d[w].mp[][i]))return ;
}
if(equ(d[w].mp[][],d[w].mp[][],d[w].mp[][],d[w].mp[][]))return ;
if(equ(d[w].mp[][],d[w].mp[][],d[w].mp[][],d[w].mp[][]))return ;
return ;
}
int Hash(){//哈希判重
int s=,k=;
for(int i=;i<=;i++)
for(int j=;j<=;j++)
{s+=d[w].mp[i][j]*k;k*=;}
s%=;
if(!hash[s]){hash[s]=;return ;}
return ;
}
bool pd(int x,int y){
int k=next[t];
if(x>||y>||x==||y==)return ;
else if(d[t].mp[x][y]==k)return ;
return ;
}
void sp(int &a,int &b){int t=a;a=b;b=t;}
void move(int x,int y){
for(int i=;i<;i++)
{
int p=x+xx[i],q=y+yy[i];
if(pd(p,q))
{
for(int j=;j<=;j++)
for(int k=;k<=;k++)
d[w].mp[j][k]=d[t].mp[j][k];
sp(d[w].mp[x][y],d[w].mp[p][q]);
step[w]=step[t]+;
if(check()){cout<<step[w];flag=;return;}
if(Hash())
{
if(next[t]==)next[w++]=;
if(next[t]==)next[w++]=;
}
}
}
}
void search(){
while(t<w)
{
for(int i=;i<=;i++)
for(int j=;j<=;j++)
{
if(d[t].mp[i][j]==)move(i,j);
if(flag)return;
}
t++;
}
}
int main(){
char x;
for(int i=;i<=;i++)
for(int j=;j<=;j++)
{
cin>>x;
if(x=='W')d[].mp[i][j]=d[].mp[i][j]=;
else if(x=='B')d[].mp[i][j]=d[].mp[i][j]=;
}
search();
return ;
}

codevs 1004 四子连棋 BFS、hash判重的更多相关文章

  1. codevs 1004 四子连棋

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

  2. CODEVS 1004四子连棋

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

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

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

  4. Codevs p1004 四子连棋

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

  5. 【wikioi】1004 四子连棋

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

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

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

  7. CODEVS——T 1004 四子连棋

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

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

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

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

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

随机推荐

  1. ubuntu下使用qemu模拟ARM(六)------驱动程序【转】

    转自:http://blog.csdn.net/rfidunion/article/details/54709843 驱动程序分为在ubuntu上运行和在ARM开发板上运行两种,我们分别来进行测试 1 ...

  2. C 语言问题

    1.  如何生成 "半全局变量", 就是那种只能被部分源文件中的部分函数访问变量? 答: 这在C语言中办不到. 如果不能或不方便在一个源文件中放下所有的函数, 那么有三种的解决方案 ...

  3. ADB常用命令(二)

    参考  http://adbshell.com/commands 常用命令 查看adb 版本 adb version 打印所有附加模拟器/设备的列表 adb devices 设备序列号 adb get ...

  4. netstat-ll-grep-nohup-df-supervisord

    ============http://man.linuxde.net/=========== 0 vi / n是查找下一个,alt+n是上一个  u撤销上一步,回到上一步 1. 根据进程号(4974) ...

  5. python网络编程-同步IO和异步IO,阻塞IO和非阻塞IO

    同步IO和异步IO,阻塞IO和非阻塞IO分别是什么,到底有什么区别?不同的人在不同的上下文下给出的答案是不同的.所以先限定一下本文的上下文. 本文讨论的背景是Linux环境下的network IO. ...

  6. pyquery学习笔记

    很早就听说了pyquery的强大.写了个简单的测试程序实验下. 思路是找个动态网页,先用PhantomJS加载,然后用PYQUERY解析. 1.随便找了个带表格的股票网页,里面有大量的股票数据,测试的 ...

  7. matlab转python

    最近在做把matlab代码转成python代码,没有用过matlab,python也只是局限于爬虫,所以.... matlab与python最大的不同是,matlab的下标是从1开始的,python和 ...

  8. 为什么有些网页QQ浏览器右键没有检查

    改成[极速内核]. 设置->高级设置 改成[极速内核]: 如下图:

  9. MySQL学习笔记:时间差

    1.MySQL计算同一张表中同一列的时间差,同一个id,有多个时间,求出每个id最早时间和最晚时间之间的差值. 原始表如下: 查询语句: SELECT id, MAX(TIME), MIN(TIME) ...

  10. vue 插槽slot

    本文是对官网内容的整理 https://cn.vuejs.org/v2/guide/components.html#编译作用域 在使用组件时,我们常常要像这样组合它们: <app> < ...