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. java系统的优化

    1.tomcat.jboss.jetty的jvm内存,增大 2.数据库的优化,如MySQL的innodb_buffer_pool_size等参数,增大

  2. Awk基础

    Awk文本处理 awk是一种编程语言,用于在linux/unix下对文本和数据进行处理.awk数据可以来自标准输入.一个或多个文件,或其它命令的输出.awk通常是配合脚本进行使用, 是一个强大的文本处 ...

  3. ios 个人开发者账户 给其他团队用坑爹的教程

    最新版本的 ios  支持 3个开发者证书 和 3个发布者证书  ,如果是多余3台电脑设备要真机调试,就比较麻烦 (手机支持100个设备) 解决方案就是: 在别人的电脑上要成功安装,须具备两个文件: ...

  4. mac搭建lamp环境

    转载:https://www.cnblogs.com/beautiful-code/p/7465320.html

  5. window时间同步机制的简单介绍

    1 window自身现在采用w32tm程序来进行时间校正,window自身携带NTP程序,但默认下时关闭的,默认的NTP时客户端. 2 w32tm时用来代替早期的时钟同步程序net  time 3 w ...

  6. GLOBAL_NAMES参数研究

    最近在配置Stream时,发现必须要把GLOBAL_NAMES参数的指设置为TRUE,具体原因为何不知.但是发现在设置了该参数之后,数据库每天的物化视图刷新出现了问题.之后查明原因,是DBLINK出现 ...

  7. SQL Server 2000中查询表名,列名及字段类型

    经常碰到一些忘记表名称的情况,此时只记得个大概,此时可通过查询系统表Sysobjects找到所要的表名,如要查找包含用户的表名,可通过以下SQL语句实现, Select * From sysobjec ...

  8. LeetCode403. Frog Jump

    A frog is crossing a river. The river is divided into x units and at each unit there may or may not ...

  9. Struts 2 Tutorial

    Apache Struts 2 is an elegant, extensible framework for creating enterprise-ready Java web applicati ...

  10. java根据日期获取周几和获取某段时间内周几的日期

    整理两个日期的方法. 根据日期获取当天是周几 /** * 根据日期获取当天是周几 * @param datetime 日期 * @return 周几 */ public static String d ...