【问题描述】

黑白棋游戏的棋盘由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[..,..] of char;
  2. rec=record
  3. m:arr;
  4. step:longint;
  5. ans:array[..,..] of char;
  6. end;
  7. const dx:array[..] of longint=(,-,,);
  8. dy:array[..] of longint=(,,-,);
  9. var start,ans:rec;
  10. f:array[..] of boolean;
  11. spos,epos:arr;
  12. fr,r,i,j:longint;
  13. a:array[..] of rec;
  14. function equal(m:arr):boolean;
  15. var i,j:longint;
  16. begin
  17. for i:= to do
  18. for j:= to 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:=;
  26. for i:= to do
  27. for j:= to do
  28. begin
  29. res:=(res shl );
  30. res:=res+ord(m[i,j])-ord('');
  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:=;r:=;
  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:= to do
  53. for j:= to do
  54. for k:= to do
  55. begin
  56. next:=now;
  57. inc(next.step);
  58. x:=i+dx[k];
  59. y:=j+dy[k];
  60. if (x>=)and(x<=)and(y>=)and(y<=) 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,]:=chr(ord('')+i);
  66. next.ans[next.step,]:=chr(ord('')+j);
  67. next.ans[next.step,]:=chr(ord('')+x);
  68. next.ans[next.step,]:=chr(ord('')+y);
  69. next.ans[next.step,]:=#;//存储哪两个坐标换了位置
  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:= to do
  88. begin
  89. for j:= to do
  90. read(spos[i,j]);
  91. readln;
  92. end;
  93. for i:= to do
  94. begin
  95. for j:= to do
  96. read(epos[i,j]);
  97. readln;
  98. end;
  99. for i:= to do
  100. for j:= to do
  101. start.m[i,j]:=spos[i,j];
  102. start.step:=;
  103. a[]:=start;
  104. bfs;
  105. writeln(ans.step);
  106. for i:= to ans.step do
  107. begin
  108. for j:= to do
  109. write(ans.ans[i,j]);
  110. writeln;
  111. end;
  112. end.

黑白棋游戏 (codevs 2743)题解的更多相关文章

  1. 用Dart写的黑白棋游戏

    2013年11月,Dart语言1.0稳定版SDK发布,普天同庆.从此,网页编程不再纠结了. 在我看来,Dart语法简直就是C#的升级版,太像了.之所以喜欢Ruby的一个重要理由是支持mixin功能,而 ...

  2. [CareerCup] 8.8 Othello Game 黑白棋游戏

    8.8 Othello is played as follows: Each Othello piece is white on one side and black on the other. Wh ...

  3. 洛谷 题解 P1225 【黑白棋游戏】

    看见很多dalao写了什么双向BFS,蒟蒻表示不会写啊. 怎么办办? 先来分析一下题目,一眼看去就是一个搜索题,考虑DFS与BFS. 先放一份DFS的代码: #include<bits/stdc ...

  4. BZOJ2319 : 黑白棋游戏

    将01串按1分段,那么分析可得长度为$a$的段拼上长度为$b$的段的SG值为$a-[a\leq b]$. 设$f[i][j][k][l]$表示从后往前用了$i$个1,$j$个0,当前段长度为$k$,后 ...

  5. 洛谷 - P1225 - 黑白棋游戏 - bfs

    神奇bug,没有记录pre就show了,找了1个小时. #include <bits/stdc++.h> using namespace std; #define ll long long ...

  6. Bzoj 2281 [Sdoi2011]黑白棋 题解

    2281: [Sdoi2011]黑白棋 Time Limit: 3 Sec  Memory Limit: 512 MBSubmit: 592  Solved: 362[Submit][Status][ ...

  7. BZOJ 2281: [Sdoi2011]黑白棋 (Nim游戏+dp计数)

    题意 这题目有一点问题,应该是在n个格子里有k个棋子,k是偶数.从左到右一白一黑间隔出现.有两个人不妨叫做小白和小黑.两个人轮流操作,每个人可以选 1~d 枚自己颜色的棋子,如果是白色则只能向右移动, ...

  8. 【BZOJ2281】[SDOI2011]黑白棋(博弈论,动态规划)

    [BZOJ2281][SDOI2011]黑白棋(博弈论,动态规划) 题面 BZOJ 洛谷 题解 先看懂这题目在干什么. 首先BZOJ上面的题面没有图,换到洛谷看题就有图了. 不难发现都相邻的两个异色棋 ...

  9. bzoj 2281 [Sdoi2011]黑白棋(博弈+组合计数)

    黑白棋(game) [问题描述] 小A和小B又想到了一个新的游戏. 这个游戏是在一个1*n的棋盘上进行的,棋盘上有k个棋子,一半是黑色,一半是白色. 最左边是白色棋子,最右边是黑色棋子,相邻的棋子颜色 ...

随机推荐

  1. X60的BIOS白名单-黑苹果之路

    一时兴起装起了黑苹果,用了最古老的thinkpad X60.装完了才发现无线网卡是硬伤,无法驱动,只有淘了个博通的无线网卡,但商家告诉我需要搞定白名单. 于是在商家的帮助下折腾半天,终于搞定. 1.在 ...

  2. Codeforces Round #218 (Div. 2) B. Fox Dividing Cheese

    B. Fox Dividing Cheese time limit per test 1 second memory limit per test 256 megabytes input standa ...

  3. 联系博主(推介联系QQ)

    李莫,OI 蒟蒻一只 QQ:740929894 邮箱:12958954@163.com limo740929894@gmail.com (目测国外网站的邮件发不进网易邮箱,所以注册了个Gmail,但是 ...

  4. EB(存储单位)

    abbr.艾字节,1EB=1024PB 计算机的存储单位 位 bit (比特)(Binary Digits):存放一位二进制数,即 0 或 1,最小的存储单位. 字节 byte:8个二进制位为一个字节 ...

  5. 可视化数据包分析工具-CapAnalysis

    可视化数据包分析工具-CapAnalysis 我们知道,Xplico是一个从pcap文件中解析出IP流量数据的工具,本文介绍又一款实用工具-CapAnalysis(可视化数据包分析工具),将比Xpli ...

  6. ASP.NET的SEO:Linq to XML---网站地图和RSS Feed

    本系列目录网站地图的作用是让搜索引擎尽快的,更多的收录网站的各个网页.    这里我们首先要明白一个基本的原理,搜索引擎的爬行方式.整个互联网就像一张纵横交错的"网":网的各个节点 ...

  7. WP8_访问ListBox中的Item项中的某个元素

    How to access a Control placed inside ListBox ItemTemplate in WP7(转) In this post I am going to talk ...

  8. CSS3 Filter

    Filters主要是运用在图片上,以实现一些特效.(尽管他们也能运用于video上),不过我们在些只来讨论图片上的运用. 语法: elm { filter: none | <filter-fun ...

  9. FTP操作

    using System; using System.Collections.Generic; using System.Text; using System.IO; using System.Net ...

  10. [原]POJ1141 Brackets Sequence (dp动态规划,递归)

    本文出自:http://blog.csdn.net/svitter 原题:http://poj.org/problem?id=1141 题意:输出添加括号最少,并且使其匹配的串. 题解: dp [ i ...