1004 四子连棋 

 时间限制: 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


很像八数码问题,状态空间搜索

保存State一个二维数组,本次选的颜色,步数,(封装一个结构体也可以),BFS就行了,每次从空白走

hash表来判重

手写队列一个好处是可以直接用队列的编号

PS:1从hzwer那里学了些命名

   2据说迭代加深也可以,感觉并不好写

//
// main.cpp
// codevs1004
//
// Created by Candy on 9/29/16.
// Copyright © 2016 Candy. All rights reserved.
// #include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
using namespace std;
const int N=,MAXN=1e6,MOD=,hashsize=2e5;
typedef int State[N][N];
inline int read(){
char c=getchar();int x=,f=;
while(c<''||c>''){if(c=='-')f=-;c=getchar();}
while(c>=''&&c<=''){x=x*+c-'';c=getchar();}
return x;
}
int dx[]={,,,-},dy[]={,-,,},ans=-;
char s[N];
State q[MAXN];
int head=,tail=,d[MAXN],col[MAXN];
bool equ(char a,char b,char c,char d){
if(a!=b||b!=c||c!=d) return false;
return true;
}
bool check(State &a){
for(int i=;i<=;i++){
if(equ(a[i][],a[i][],a[i][],a[i][])) return ;
if(equ(a[][i],a[][i],a[][i],a[][i])) return ;
}
if(equ(a[][],a[][],a[][],a[][]))return ;
if(equ(a[][],a[][],a[][],a[][]))return ;
return ;
}
bool valid(int x,int y,int num){
if(x<||x>||y<||y>) return ;
if(q[num][x][y]!=col[num]) return ;
return ;
}
int h[hashsize],ne[hashsize];
void init(){memset(h,,sizeof(h));}
int gethash(State &s){
int x=;
for(int i=;i<=;i++){
for(int j=;j<=;j++) x=x*+s[i][j];
x%=MOD;
}
return x;
}
bool tti(int num){
int x=gethash(q[num]);
for(int i=h[x];i;i=ne[i])
if(memcmp(q[i],q[num],sizeof(q[num]))==) return ;
ne[num]=h[x];
h[x]=num;
return ;
}
void move(int x,int y){
State &s=q[head];
for(int i=;i<;i++){
int nx=x+dx[i],ny=y+dy[i];
if(!valid(nx,ny,head)) continue;
State &t=q[++tail];
memcpy(t,s,sizeof(s));
swap(t[nx][ny],t[x][y]);
if(tti(tail)){
d[tail]=d[head]+;
col[tail]=col[head]==?:;
}
else tail--;
if(check(t)) ans=d[tail];
}
}
void bfs(){
while(head<=tail){
State &now=q[head]; //printf("head %d\n",head);
for(int i=;i<=;i++)
for(int j=;j<=;j++)
if(now[i][j]==) move(i,j);
if(ans!=-) return;
head++;
}
}
int main(int argc, const char * argv[]) {
State &a=q[++tail],&b=q[++tail];
for(int i=;i<=;i++){
scanf("%s",s+);
for(int j=;j<=;j++){
if(s[j]=='B') a[i][j]=b[i][j]=;
else if(s[j]=='W') a[i][j]=b[i][j]=;
else if(s[j]=='O') a[i][j]=b[i][j]=;
}
}
col[]=;col[]=;
bfs();
printf("%d",ans);
return ;
}

  

codevs1004四子连棋[BFS 哈希]的更多相关文章

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

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

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

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

  3. codevs1004四子连棋

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

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

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

  5. codevs1004 四子连棋

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

  6. Codevs p1004 四子连棋

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

  7. 【洛谷 P2346】四子连棋(状态压缩,搜索)

    其实这题可以直接二进制状压做,1表示黑棋,0表示白棋,另外记录下2个空点的位置就行了. 具体看代码(冗长): #include <iostream> #include <cstdio ...

  8. P2346 四子连棋

    P2346 四子连棋 迭代加深++ 题意描述 在一个4*4的棋盘上摆放了14颗棋子,其中有7颗白色棋子,7颗黑色棋子,有两个空白地带,任何一颗黑白棋子都可以向上下左右四个方向移动到相邻的空格,这叫行棋 ...

  9. codevs 1004 四子连棋

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

随机推荐

  1. js调用soapWebService服务

    js调用soapWebService服务 什么是 SOAP? SOAP 指简易对象访问协议 SOAP 是一种通信协议 SOAP 用于应用程序之间的通信 SOAP 是一种用于发送消息的格式 SOAP 被 ...

  2. 百度编辑器 UEditor 报错汇总

    1,编辑文本时使用js将需要编辑内容setContent到编辑器里,总是报(IE8及IE11):'this.body' 为空或不是对象,详细如下,其实报这样的错除多半是加载先后或加载不完全导致的: 消 ...

  3. MSCRM 报表显示 rsprocessingaborted 错误

    今天又有朋友遇到rsprocessingaborted这个问题,想想这个已经是很老很老的问题了,得在写一遍补充下. 一.首先会考虑是不是SrsDataConnector没有安装的原因,如果正常安装的话 ...

  4. Mac OX上安装MongoDb

    MongoDB的安装有好多种安装方法,有普通青年的HomeBrew方式,也有文艺青年的源码编译方式.我只想快速的装起来用一下,所以我选最简单的HomeBrew. 请参考官方文档 : http://do ...

  5. 高性能JS笔记3——DOM编程

    一.访问与修改DOM DOM和JS 相当于两个岛屿,访问操作的次数越多,要交的过路费越多,对性能产生很大影响. 减少访问DOM的次数,把运算尽量留在JS端操作. 二.innerHTML 对比 DOM ...

  6. Android 的系统架构

    Android 的系统架构 Android其本质就是在标准的Linux系统上增加了Java虚拟机Dalvik,并在Dalvik虚拟机上搭建了一个JAVA的application framework,所 ...

  7. Xcode 8.1 : Unable to read from device

    今天升级了Xcode 8.1,准备在iOS10.0.2的iPhone 6 Plus上调试,提示:Unable to read from device. 查看文件路径:"~/Library/D ...

  8. android开发中常见布局的注意点

    常见布局的注意点 线性布局: 必须有一个布局方向 水平或者垂直 在垂直布局中 只有左对齐 右对齐 水平居中生效 在水平布局中 只有顶部对齐 底部对齐 垂直居中生效 权重:组件按比例分配屏幕的剩余部分( ...

  9. Swift开发第十篇——可变参数函数&初始化方法顺序

    本篇分为两部分: 一.Swift中的可变参数函数 二.初始化方法的顺序 一.Swift中的可变参数函数 可变参数函数指的是可以接受任意多个参数的函数,在 OC 中,拼接字符串的函数就属于可变参数函数 ...

  10. iOS-工作经验+资料分享(长期更新)

    在此记录工作中的一些经验和技术资料 长期更新 欢迎各位业内朋友指正.交流技术上的问题 0.苹果开发联盟电话 4006 701855 1.轻易不用使用tableViewController,因为改变他自 ...