黑白棋游戏 (codevs 2743)题解
【问题描述】
黑白棋游戏的棋盘由4×4方格阵列构成。棋盘的每一方格中放有1枚棋子,共有8枚白棋子和8枚黑棋子。这16枚棋子的每一种放置方案都构成一个游戏状态。在棋盘上拥有1条公共边的2个方格称为相邻方格。一个方格最多可有4个相邻方格。在玩黑白棋游戏时,每一步可将任何2个相邻方格中棋子互换位置。对于给定的初始游戏状态和目标游戏状态,编程计算从初始游戏状态变化到目标游戏状态的最短着棋序列。
【样例输入】
1111
0000
1110
0010
1010
0101
1010
0101
【样例输出】
4
1222
1424
3242
4344
【解题思路】
看到最少步数,果断广搜。不过状态太多,需要判重。大家可以看到,出题人在数据一栏写了必须用状态压缩,不能用康托展开和hash,他说往东走,咱们偏往西走,就用hash优化。(别想从我嘴里套出我不会状态压缩和康托展开)不过hash函数会很不好找,这里我用的是二进制转十进制的方法存hash,这样的话保证每种状态下只有一个hash函数,就不需要挂链表了,主要的是比较目前状态与目标状态是否相同时会耗费点时间,不过1s还是能过的,然后一个关键的地方就是存储哪两个坐标换了位置,我是用的字符来存的,详见代码。
【代码实现】
1 type arr=array[1..5,1..5] of char; 2 rec=record 3 m:arr; 4 step:longint; 5 ans:array[1..100,1..5] of char; 6 end; 7 const dx:array[1..4] of longint=(1,-1,0,0); 8 dy:array[1..4] of longint=(0,0,-1,1); 9 var start,ans:rec; 10 f:array[0..200000] of boolean; 11 spos,epos:arr; 12 fr,r,i,j:longint; 13 a:array[1..200000] of rec; 14 function equal(m:arr):boolean; 15 var i,j:longint; 16 begin 17 for i:=1 to 4 do 18 for j:=1 to 4 do 19 if m[i,j]<>epos[i,j] then exit(false); 20 exit(true); 21 end; 22 function hash(m:arr):longint;//二进制转十进制,用位运算,效率高 23 var res,i,j:longint; 24 begin 25 res:=0; 26 for i:=1 to 4 do 27 for j:=1 to 4 do 28 begin 29 res:=(res shl 1); 30 res:=res+ord(m[i,j])-ord('0'); 31 end; 32 exit(res); 33 end; 34 procedure bfs; 35 var t,i,j,k,x,y:longint; 36 now,next:rec; 37 temp:char; 38 begin 39 fillchar(f,sizeof(f),true); 40 t:=hash(spos); 41 f[t]:=false; 42 fr:=0;r:=1; 43 while fr<>r do 44 begin 45 inc(fr); 46 now:=a[fr]; 47 if equal(now.m) then 48 begin 49 ans:=now; 50 exit; 51 end; 52 for i:=1 to 4 do 53 for j:=1 to 4 do 54 for k:=1 to 4 do 55 begin 56 next:=now; 57 inc(next.step); 58 x:=i+dx[k]; 59 y:=j+dy[k]; 60 if (x>=1)and(x<=4)and(y>=1)and(y<=4) then 61 begin 62 temp:=next.m[i,j]; 63 next.m[i,j]:=next.m[x,y]; 64 next.m[x,y]:=temp; 65 next.ans[next.step,1]:=chr(ord('0')+i); 66 next.ans[next.step,2]:=chr(ord('0')+j); 67 next.ans[next.step,3]:=chr(ord('0')+x); 68 next.ans[next.step,4]:=chr(ord('0')+y); 69 next.ans[next.step,5]:=#0;//存储哪两个坐标换了位置 70 if equal(next.m) then 71 begin 72 ans:=next; 73 exit; 74 end; 75 t:=hash(next.m); 76 if f[t] then 77 begin 78 f[t]:=false; 79 inc(r); 80 a[r]:=next; 81 end; 82 end; 83 end; 84 end; 85 end; 86 begin 87 for i:=1 to 4 do 88 begin 89 for j:=1 to 4 do 90 read(spos[i,j]); 91 readln; 92 end; 93 for i:=1 to 4 do 94 begin 95 for j:=1 to 4 do 96 read(epos[i,j]); 97 readln; 98 end; 99 for i:=1 to 4 do 100 for j:=1 to 4 do 101 start.m[i,j]:=spos[i,j]; 102 start.step:=0; 103 a[1]:=start; 104 bfs; 105 writeln(ans.step); 106 for i:=1 to ans.step do 107 begin 108 for j:=1 to 4 do 109 write(ans.ans[i,j]); 110 writeln; 111 end; 112 end.
转载于:https://www.cnblogs.com/PengBoLiuXu/p/4518105.html
黑白棋游戏 (codevs 2743)题解相关推荐
- P3084 黑白棋游戏
P3084 黑白棋游戏 时间: 1000ms / 空间: 65536KiB / Java类名: Main 描述 黑白棋游戏的棋盘由4×4方格阵列构成.棋盘的每一方格中放有1枚棋子,共有8枚白棋子和 ...
- 【9801】黑白棋游戏
Time Limit: 3 second Memory Limit: 2 MB [问题描述] 黑白棋游戏的棋盘由4*4方格阵列构成.棋盘的每一方格中放有1枚棋子,共有8枚白棋子和8枚黑棋子.这16枚棋 ...
- c语言大作业黑白棋,C语言编写黑白棋游戏源代码.doc
C语言编写的黑白棋游戏源代码 /*3.3.4 源程序*/ #include "graphics.h" /*图形系统头文件*/ #define LEFT 0x4b00 /*光标左键值 ...
- 【Python案例】基于Pygame黑白棋游戏(附源码)
有没有小火伴是特别喜欢玩五子棋的,我记得我初中是特别喜欢的.于是,我今天就用Python给大家写了一个黑白棋游戏.代码放在下面了. 01.绘制棋盘 Python学习交流Q群:906715085### ...
- c语言课程设计之黑白棋游戏,c语言课程设计黑白棋游戏.doc
您所在位置:网站首页 > 海量文档  > 学术论文 > 大学论文 c语言课程设计黑白棋游戏.doc26页 本文档一共被 ...
- html5怎么判断迷宫输赢,HTML5 实现黑白棋游戏|附代码
2)初始化游戏界面 游戏开始时,init()对保存棋盘上的棋子信息的qizi数组初始化,同时在棋盘上显示初始的4个棋子. function init(){ initLevel( ...
- C++ 黑白棋游戏的实现
时光荏苒..眨眼间半年过去了.半年间我的人生轨迹经历了重大的改变.我最终还是决定把我在去年暑假里实现的这个C++的黑白棋游戏发布在我的CSDN博客上.这或许是我写的最后一个C++程序了. 记得当时,7 ...
- 黑白棋游戏 (BFS + 位运算初步运用)
题目描述 黑白棋游戏的棋盘由4×4方格阵列构成.棋盘的每一方格中放有1枚棋 子,共有8枚白棋子和8枚黑棋子.这16枚棋子的每一种放置方案都构成一个游戏状态.在棋盘上拥有1条公共边的2个方格称为相邻 ...
- 基于Python的Reversi黑白棋游戏设计与开发
摘 要 黑白棋是一个相当易学,而且很受欢迎的游戏.近年来,随着机器性能的提高和相关理论的完善,人工智能这一领域变得越来越重要,在实际生活中的运用也越来越广泛.为了学习简单的人工智能,我决定用Pytho ...
- c语言写的黑白棋游戏代码,C语言编写的黑白棋游戏源代码..doc
C语言编写的黑白棋游戏源代码. C语言编写的黑白棋游戏/*3.3.4 源程序*/ #include "graphics.h" /*图形系统头文件*/ #define LEFT 0x ...
最新文章
- 推荐系统中的前沿技术研究与落地:深度学习、AutoML与强化学习 | AI ProCon 2019...
- 和我一起打造个简单搜索之SpringDataElasticSearch入门
- Microsoft宣称Visual Studio Installer将退役
- node中npm安装模块的网络问题
- 微软正在帮助政府构建AI灾难响应工具
- 使用 netfilter 处理IPv6报文
- Python基础教程: with语句详解
- 在SAP ABAP和Hybris Commerce里启动后台作业
- 部署OCS后修改web farm地址
- bat与C语言混合编程,BAT与HTML混合编程的方法
- Java对象模型-oop和klass
- FFMpeg分析详细分析
- linux网卡配置文件中2个ip,Linux Centos 7系统中如何一个网卡配置多个IP
- 【自动化__持续集成】___java___代码非空指针
- java递归算法的实例最细讲解
- Python量化资源大合集
- python遍历json_python3如何遍历json数据
- Excel 冻结窗格
- 【学术】参考文献管理
- MySQL 字符集和校对集