【问题描述】

黑白棋游戏的棋盘由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)题解相关推荐

  1. P3084 黑白棋游戏

      P3084 黑白棋游戏 时间: 1000ms / 空间: 65536KiB / Java类名: Main 描述 黑白棋游戏的棋盘由4×4方格阵列构成.棋盘的每一方格中放有1枚棋子,共有8枚白棋子和 ...

  2. 【9801】黑白棋游戏

    Time Limit: 3 second Memory Limit: 2 MB [问题描述] 黑白棋游戏的棋盘由4*4方格阵列构成.棋盘的每一方格中放有1枚棋子,共有8枚白棋子和8枚黑棋子.这16枚棋 ...

  3. c语言大作业黑白棋,C语言编写黑白棋游戏源代码.doc

    C语言编写的黑白棋游戏源代码 /*3.3.4 源程序*/ #include "graphics.h" /*图形系统头文件*/ #define LEFT 0x4b00 /*光标左键值 ...

  4. 【Python案例】基于Pygame黑白棋游戏(附源码)

    有没有小火伴是特别喜欢玩五子棋的,我记得我初中是特别喜欢的.于是,我今天就用Python给大家写了一个黑白棋游戏.代码放在下面了. 01.绘制棋盘 Python学习交流Q群:906715085### ...

  5. c语言课程设计之黑白棋游戏,c语言课程设计黑白棋游戏.doc

    您所在位置:网站首页 > 海量文档 &nbsp>&nbsp学术论文&nbsp>&nbsp大学论文 c语言课程设计黑白棋游戏.doc26页 本文档一共被 ...

  6. html5怎么判断迷宫输赢,HTML5 实现黑白棋游戏|附代码

    2)初始化游戏界面 游戏开始时,init()对保存棋盘上的棋子信息的qizi数组初始化,同时在棋盘上显示初始的4个棋子. function init(){             initLevel( ...

  7. C++ 黑白棋游戏的实现

    时光荏苒..眨眼间半年过去了.半年间我的人生轨迹经历了重大的改变.我最终还是决定把我在去年暑假里实现的这个C++的黑白棋游戏发布在我的CSDN博客上.这或许是我写的最后一个C++程序了. 记得当时,7 ...

  8. 黑白棋游戏 (BFS + 位运算初步运用)

    题目描述   黑白棋游戏的棋盘由4×4方格阵列构成.棋盘的每一方格中放有1枚棋 子,共有8枚白棋子和8枚黑棋子.这16枚棋子的每一种放置方案都构成一个游戏状态.在棋盘上拥有1条公共边的2个方格称为相邻 ...

  9. 基于Python的Reversi黑白棋游戏设计与开发

    摘 要 黑白棋是一个相当易学,而且很受欢迎的游戏.近年来,随着机器性能的提高和相关理论的完善,人工智能这一领域变得越来越重要,在实际生活中的运用也越来越广泛.为了学习简单的人工智能,我决定用Pytho ...

  10. c语言写的黑白棋游戏代码,C语言编写的黑白棋游戏源代码..doc

    C语言编写的黑白棋游戏源代码. C语言编写的黑白棋游戏/*3.3.4 源程序*/ #include "graphics.h" /*图形系统头文件*/ #define LEFT 0x ...

最新文章

  1. 推荐系统中的前沿技术研究与落地:深度学习、AutoML与强化学习 | AI ProCon 2019...
  2. 和我一起打造个简单搜索之SpringDataElasticSearch入门
  3. Microsoft宣称Visual Studio Installer将退役
  4. node中npm安装模块的网络问题
  5. 微软正在帮助政府构建AI灾难响应工具
  6. 使用 netfilter 处理IPv6报文
  7. Python基础教程: with语句详解
  8. 在SAP ABAP和Hybris Commerce里启动后台作业
  9. 部署OCS后修改web farm地址
  10. bat与C语言混合编程,BAT与HTML混合编程的方法
  11. Java对象模型-oop和klass
  12. FFMpeg分析详细分析
  13. linux网卡配置文件中2个ip,Linux Centos 7系统中如何一个网卡配置多个IP
  14. 【自动化__持续集成】___java___代码非空指针
  15. java递归算法的实例最细讲解
  16. Python量化资源大合集
  17. python遍历json_python3如何遍历json数据
  18. Excel 冻结窗格
  19. 【学术】参考文献管理
  20. MySQL 字符集和校对集

热门文章

  1. 炉窑燃烧的空气过剩系数计算方法
  2. 2021牛年二月|各行业节日热点营销方案
  3. React-native-base Icon图标地址
  4. 领慧立芯LHA6916,软硬件直接替代AD7616,适用FTU/DTU配电、继电保护等
  5. sql题目练习 数据库脚本和答案
  6. 拇指赚点赞无加密源码发布分享仅供学习
  7. 从今天开始学python
  8. 搜狗即将发布儿童手表,不过它的最大亮点却是王小川
  9. 大数据学习记录-Hadoop框架核心(HDFS、MapReduce、YARN)
  10. coc java_Java Spring 3 MVC注释与COC。Java社区中的首选方法是什么?