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

转载于:https://www.cnblogs.com/qscqesze/p/4227210.html

codevs 1004 四子连棋 BFS、hash判重相关推荐

  1. [Codevs] 1004 四子连棋

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

  2. poj 3131 双向搜索+hash判重

    题意: 初始状态固定(朝上的全是W,空格位置输入给出),输入初始状态的空格位置,和最终状态朝上的位置,输出要多少步才能移动到,超过30步输出-1. 简析: 每一个格子有6种状态,分别是 0WRB, 1 ...

  3. 【codevs1004】四子连棋

    problem solution codes //思路:把空白当棋,交替黑白走. //实现:BFS, 打表判断是否成立 #include<iostream> #include<alg ...

  4. poj 3131 Cubic Eight-Puzzle 双向广搜 Hash判重

    挺不错的题目,很锻炼代码能力和调试能力~ 题意:初始格子状态固定,给你移动后格子的状态,问最少需要多少步能到达,如果步数大于30,输出-1. 由于单向搜索状态太多,搜到二十几就会爆了,所以应该想到双向 ...

  5. POJ1465 Multiple——Bfs+余数判重——Pku1465

    这道题精在判重优化.因为如果存在两个数A.B,且满足A mod n=B mod n=C,那么,这两种情况可以看做是重复的,保留较小数即可.具体优化,开一个布尔数组即可. 特别需要注意一点:如果n=0, ...

  6. UVA 1533 Moving Pegs(bfs+hash)

    题意: 一个跳棋,给定一个空位.求最少步数且字典序最小使得跳到最后棋盘只剩一个旗子,且在初始的空位上. 思路: BFS + hash判重,这题的思路还是比较好想的,但是我看网络上面的代码,都是打表+b ...

  7. java四子棋实验报告_Python 实现劳拉游戏的实例代码(四连环、重力四子棋)

    游戏规则:双方轮流选择棋盘的列号放进自己的棋子, 若棋盘上有四颗相同型号的棋子在一行.一列或一条斜线上连接起来, 则使用该型号棋子的玩家就赢了! 程序实现游戏,并将每局的数据保存到本地的文件中 首先我 ...

  8. python人机对战的实验步骤_人机对战初体验:Python实现四子棋游戏

    继去年3月人机大战引发全球瞩目以来,围棋AI(人工智能)再度引发跨领域的关注:一个叫Master的围棋AI,几天时间,面对中日韩顶尖职业围棋选手,已取得60胜0败的恐怖战绩,展现出的围棋技艺已经到了人 ...

  9. 四子棋 freepython

    四子棋,是黑白棋的一种.是一种益智的棋类游戏.黑白两方(也有其它颜色的棋子)在8*8的格子内依次落子.黑方为先手,白方为后手.落子规则为,每一列必须从最底下的一格开始.依此可向上一格落子.一方落子后另 ...

最新文章

  1. 哪种云存储服务最适合你?
  2. Unity制作游戏中的场景
  3. Struts2中的拦截器与过滤器学习
  4. 20172314 2018-2019-1《程序设计与数据结构》第四周学习总结
  5. php memcache 64,PHP 5.3.13 memcache win 64 配置和安装
  6. spring学习(44):p名称空间注入
  7. 一个4体低位交叉的存储器_前交叉韧带术后关节粘连的康复策略
  8. 创业者需要广泛了解市场中相关产品的基本情况
  9. phpstorm,webstorm取消自动保存并标识修改的文件为星星标记
  10. install opencv 4.1.1 from source on windows,在其他项目中用cmake去引用
  11. Android手机模拟器如何把语言设置为中文
  12. BERT模型自定义词汇以及token相关
  13. 190725每日一句
  14. 计算机系酒店管理毕业论文,计算机专业酒店管理系统毕业论文讲述.doc
  15. 域——windows服务器域详解
  16. 经度,纬度的正则表达式
  17. WPF使用GMap.net框架开发地图应用
  18. InfoPath 2007 --来自microsoft.com
  19. Centos版Linux 一些常用操作命令 收集
  20. 一招,提高 Github 成员微信群运营效率

热门文章

  1. 积性函数与Dirichlet卷积 学习小记
  2. JZOJ 5622. 【NOI2018模拟4.2】table
  3. mysql附加服务器失败_今天,启动MySQL服务器失败,
  4. Qt对象类型转换(char* int与Qstring间的转换)
  5. ms17-010 php版本,那年MS17-010
  6. vs找不到dll_零基础学习Python_绝对VS相对
  7. 服务器操作系统百度文库,Linux操作系统配置服务器的方法及实现_百度文库(6页)-原创力文档...
  8. linux部署jar项目报错_如何在Linux服务器上部署jar包
  9. 神秘大三角(判断点与三角形的关系)
  10. mysql数据库崩溃恢复_MySQL数据库表维护和崩溃恢复