codevs 1004 四子连棋 BFS、hash判重
004 四子连棋
在一个4*4的棋盘上摆放了14颗棋子,其中有7颗白色棋子,7颗黑色棋子,有两个空白地带,任何一颗黑白棋子都可以向上下左右四个方向移动到相邻的空格,这叫行棋一步,黑白双方交替走棋,任意一方可以先走,如果某个时刻使得任意一种颜色的棋子形成四个一线(包括斜线),这样的状态为目标棋局。
● | ○ | ● | |
○ | ● | ○ | ● |
● | ○ | ● | ○ |
○ | ● | ○ |
从文件中读入一个4*4的初始棋局,黑棋子用B表示,白棋子用W表示,空格地带用O表示。
用最少的步数移动到目标棋局的步数。
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判重的更多相关文章
- codevs 1004 四子连棋
1004 四子连棋 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 黄金 Gold 题目描述 Description 在一个4*4的棋盘上摆放了14颗棋子,其中有7颗白 ...
- CODEVS 1004四子连棋
[题目描述 Description] 在一个4*4的棋盘上摆放了14颗棋子,其中有7颗白色棋子,7颗黑色棋子,有两个空白地带,任何一颗黑白棋子都可以向上下左右四个方向移动到相邻的空格,这叫行棋一步,黑 ...
- codevs1004四子连棋[BFS 哈希]
1004 四子连棋 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 黄金 Gold 题目描述 Description 在一个4*4的棋盘上摆放了14颗棋子,其中有7颗 ...
- Codevs p1004 四子连棋
四子连棋 题目描述 Description 在一个4*4的棋盘上摆放了14颗棋子,其中有7颗白色棋子,7颗黑色棋子,有两个空白地带,任何一颗黑白棋子都可以向 ...
- 【wikioi】1004 四子连棋
题目链接 算法:BFS //2014-02-05更新 *******************************2013-10-15******************************* ...
- BFS搜索算法应用_Codevs 1004 四子连棋
#define _CRT_SECURE_NO_WARNINGS #include <iostream> #include <algorithm> #include <cs ...
- CODEVS——T 1004 四子连棋
http://codevs.cn/problem/1004/ 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 黄金 Gold 题解 查看运行结果 题目描述 Descr ...
- 迭代加深搜索[codevs1004 四子连棋]
迭代加深搜索 一.算法简介 迭代加深搜索是在速度上接近广度优先搜索,空间上和深度优先搜索相当的搜索方式.由于在使用过程中引入了深度优先搜索,所以也可以当作深度优先搜索的优化方案. 迭代加深搜索适用于当 ...
- 【宽度优先搜索】神奇的状态压缩 CodeVs1004四子连棋
一.写在前面 其实这是一道大水题,而且还出在了数据最水的OJ上,所以实际上这题并没有什么难度.博主写这篇blog主要是想写下一个想法--状态压缩.状态压缩在记录.修改状态以及判重去重等方面有着极高的( ...
随机推荐
- 谈谈.NET MVC QMVC高级开发
自从吾修主页上发布了QMVC1.0,非常感兴趣,用了半月的时间学习,真的感觉收益非浅,在此声明非常感谢吾修大哥的分享! 1.轻快简单,框架就几个类,简单,当然代码少也就运行快!单纯的MVC,使的如果你 ...
- Python操作Excle
python操作excel主要用到xlrd和xlwt这两个库,即xlrd是读excel,xlwt是写excel的库.可从这里下载https://pypi.python.org/pypi.下面分别记录p ...
- SQLAlchemy-对象关系教程ORM-一对多(外键),一对一,多对多
一:一对多 表示一对多的关系时,在子表类中通过 foreign key (外键)引用父表类,然后,在父表类中通过 relationship() 方法来引用子表的类. 在一对多的关系中建立双向的关系,这 ...
- 深度学习在美团点评推荐平台排序中的应用&& wide&&deep推荐系统模型--学习笔记
写在前面:据说下周就要xxxxxxxx, 吓得本宝宝赶紧找些广告的东西看看 gbdt+lr的模型之前是知道怎么搞的,dnn+lr的模型也是知道的,但是都没有试验过 深度学习在美团点评推荐平台排序中的运 ...
- js面试题之求数组最值
今天继续分享js常见的面试题,求数组最大值,最小值,这里列举4种常见解法,还有其他方法也可以实现,读者知道可以私信我,我将把意见列举到博客中,欢迎提出意见. 第一种,利用数组排序 var arr=[3 ...
- mysql数据库主从同步复制原理
MySQL的Replication(英文为复制)是一个多MySQL数据库做主从同步的方案,特点是异步复制,广泛用在各种对MySQL有更高性能.更高可靠性要求的场合.与之对应的是另一个同步技术是MySQ ...
- Java---容器基础总结
Java提供了大量持有对象的方式: (1) 数组将数字与对象联系起来. 它保存类型明确的对象,查询对象时,不需要对结果做类型转换.它可以是多维的, 可以保存基本类型的数据. 但是,数组一旦生成,其容量 ...
- springMVC源码分析--HttpMessageConverter写write操作(三)
上一篇博客springMVC源码分析--HttpMessageConverter参数read操作中我们已经简单介绍了参数值转换的read操作,接下来我们介绍一下返回值的处理操作.同样返回值的操作操作也 ...
- Python djangorestframework安装库报错SSL: CERTIFICATE_VERIFY_FAILED
Python djangorestframework 安装库报错SSL: CERTIFICATE_VERIFY_FAILED 问题描述 使用pip按照virtualenv报错,如下: pip inst ...
- html中<b>标签和<Strong>标签的区别
关于html标签中b和strong两个的区别,我也是今早上才注意的,以前都是混着用的,早上看书的时候才注意到这两个标签的区别. 用在网页上,默认情况下它们起的均是加粗字体的作用,二者所不同的是,< ...