Win2000的空当接龙算法

myblind 2005-03-07 04:30:19
加精
以下代码是反汇编 freecall 得到的代码。有需要的同志看看 :) 。
没有给出 -1 和 -2 局的算法,因为这两局是固定的,而且无解的牌局。

int gameNum = 1; // 牌局号
int cards[168], order[53];
int i,j,k;

for (i=0; i<168; i++)
cards[i] = -1;
for (i=0; i<=52; i++)
order[i] = i;

srand(gameNum);
for (i=0; i<52; i++)
{
j = rand() % order[52];
k = i/8 + (i & 7) * 21;
cards[k] = order[j];
order[j] = order[52-i-1];
--order[52];
}

for (i=0;i<168;i++)
{
if (cards[i] == -1)
printf("%-10d", -1);
else
{
k = ((cards[i]+1 % 13)+3) / 4;
k = k?k:13; // 计算牌面大小
printf("%-2d(%-2X) ", k, cards[i]);
}
}

牌的存储结构你可以通过打印出列表,对照着 freecall 游戏看的很清楚。

虽然得到了源代码,我却仍然不明白这样为什么会使牌局有解。:(
...全文
269 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
myblind 2005-03-09
  • 打赏
  • 举报
回复
楼上的是高人,那段算法我没有看明白,现在了解了.

有一个工具可以求解牌局,据作者说使用了 A* 算法. http://notabdc.vip.sina.com/index.htm 有
zengwujun 2005-03-08
  • 打赏
  • 举报
回复
mark
PuzzleFan 2005-03-08
  • 打赏
  • 举报
回复
我把你的算法整理了一下
1、压缩了放牌数组
2、去掉了取牌队列最后一个位置
3、明确了放牌是隔8个跳放
4、显示通用的牌名
5、算法更加明确化

各位可以执行时,设置gameNum,对照空当接龙的选局号码看结果

// freecell.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"
#include <stdlib.h>

int main(int argc, char* argv[])
{

int gameNum = 1; // 牌局号
int cards[64]; // 放牌牌局
int order[53]; // 取牌队列

int to; // 放牌位置
int from; // 取牌位置

int i;

char hand[5]="CDHS"; //花色:梅花,方片,红心,黑桃
char num[14]="A23456789TJQK"; //

for (i=0; i<52; i++) order[i] = i; // 顺序摆好取牌队列
for (i=0; i<8*8; i++) cards[i] = -1; // 清除放牌牌面

srand(gameNum); //选局的号码,rand 的种子

for (i=0; i<52; i++){
// 在当前的52-i的取牌队列中选一个位置 from 取牌
// 随机数求余数后,保证 from 落在队列中实际有牌的位置
from=rand() % (52-i);

// 由于采用横向放牌:实际上每隔8个位置放一张牌:0,8,16,24...56,1,9...
// 放牌牌局中位置to的值是i的低3位和高3位交换
to = (i & 070)>>3 | (i & 07) <<3;

// 取牌队列取第from个位置的牌 order[from],放入第to个位置 cards[to]
cards[to] = order[from];

// 第from个位置的牌 order[from],用最后一张牌order[52-i-1]补上,
// 保证取牌队列不出现空位
order[from] = order[52-i-1];

// 每显示8张牌,换下一行
if((i&7)==0) printf("\n");
// 显示这张牌是什么
printf("%c%c ", hand[cards[to]%4], num[cards[to]/4]);
// 显示取牌位置和放牌位置(调试用)
// printf("take %d to %d\n",from,to);
}

printf("\n");
getchar();
return 0;
}

结论:这个算法只是简单随机抽牌,按每行8个横向摆牌,
不能保证摆出的牌局一定有解。

我原以为可以根据放牌的神秘算法编出电脑解决算法,很郁闷。

请各位大侠指教电脑解法。



myblind 2005-03-08
  • 打赏
  • 举报
回复
可我觉的应该有什么原理, 要不作者为什么说"虽然没有验证过,但请相信所有牌局都可解". (也许他忘了 11982)
NowCan 2005-03-07
  • 打赏
  • 举报
回复
也不是都可解,11982就是无解.
Intel 946-G45/Q45系列集成显卡驱动14.37.1.5029版For Win2000/XP [13.63M] 2009年02月13日 是 Intel 946-G35/Q35系列集成显卡驱动15.12.75.4.1930版For Win7-32 [22.57M] 2009年10月29日 是 Intel B43/G41/G43/G45/Q43/Q45(包括移动版)系列芯片组集成显卡驱动14.42.11.5355版For WinXP-32/XP-64 [17.81M] 2011年05月21日 无 Intel B43/G41/G43/G45/Q43/Q45(包括移动版)系列芯片组集成显卡驱动15.17.17.2413版For Vista-32/Win7-32 [37.94M] 2011年07月04日 无 Intel B43/G41/G43/G45/Q43/Q45(包括移动版)系列芯片组集成显卡驱动15.17.17.2413版For Vista-64/Win7-64 [39.89M] 2011年07月04日 无 Intel英特尔Core i3/Core i5/Core i7系列核芯显卡驱动14.46.4.5337版For WinXP-32 [22.87M] 2011年04月21日 是 Intel英特尔Core i3/Core i5/Core i7系列核芯显卡驱动15.22.4.2418 WHQL版For Vista-32/Win7-32 [67.62M] 2011年06月24日 是 Intel英特尔Core i3/Core i5/Core i7系列核芯显卡驱动15.22.4.2418 WHQL版For Vista-64/Win7-64 [84.89M] 2011年06月24日 是 Intel英特尔GMA 3150显示驱动14.37.50.4.5260版For WinXP-32 [15.25M] 2010年05月31日 无 Intel英特尔GMA 500显示驱动3.3.0版For WinXP-32 [29.75M] 2009年12月21日 是 Intel英特尔GMA 600显示驱动8.14.6.3067版For Win7-32 [25.56M] 2011年07月25日 是 S3 DeltaChrome/GammaChrome系列显卡驱动6.14.10.2021-15.16.14j版For Win2000/XP [8.55M] 2005年09月02日 无 S3 Chrome S20/GammaChrome系列显卡驱动6.14.10.2401版For Win2000/XP [10.44M] 2008年03月14日 无 S3 Chrome 400/500系列显卡驱动6.14.10.0517 WHQL版For WinXP [18.98M] 2010年11月16日 是 VIA威盛VIA Chrome9 HC IGP图形核心驱动20.07.01i版For Win2000/XP [9.84M] 2008年10月10日 是 VIA威盛UniChrome Pro图形核心驱动22.00.01e版For Win2000/XP/Vista-32 [6.67M] 2007年12月03日 是 SiS矽统Xabre 600/Xabre 400/Xabre 200/Xabre 80显卡驱动3.57.53官方正式版For Win9x/ME/2000/XP [9.47M] 2004年03月09日 是 SiS矽统SiSM771/771/M671MX/M671/671/671FX显示驱动UniVGA5 5.25版For Vista-32/Vista-64 [14.41M] 2009年12月15日 是 SiS矽统661/662/671/672/760/761芯片组显示驱动UniVGA3 3.93版For Win2000/XP/2003 [14.41M] 2010年12月15日 是 SiS矽统SiS671/671FX/672/672FX/M671/M671MX/M672/M672MX芯片组显示驱动UniVGA5 5.29版For Win7-32/Win7-64 [14.41M] 2011年01月07日 是 SiS矽统315/315E显卡驱动3.51 WHQL版For Win98/ME/2000/XP [10.60M] 2003年09月21日 是 XGI图诚Volari V3系列显卡驱动1.16.02 WHQL官方正式版For WinXP [6.41M] 2006年06月13日 无 XGI图诚Volari Z7/Z9/Z9s/Z11系列显卡驱动1.11.03 WHQL版For Win2000/XP-32/XP-64/Vista-32/Vista-64 [8.62M] 2008年11月09日 无 XGI图诚Volariz V8/V5/V3XT系列显卡驱动1.09.75官方正式版For Win2000/XP [17.49M] 2006年04月17日 是 Matrox Millennium G450/Millennium G550系列显卡驱动2.05.01.030 SE版For Win2000/XP-32/2003-32/Vista-32 [11.55M] 2007年11月10日 是 Matrox Parhelia/P650/P690/P750/M9120/M9125/M9140系列显卡驱动2.09.04.061 SE U W7版For WinXP/2003/2008/Vista/Win7 [51.60M] 2010年11月29日 无 3dfx Voodoo 3/4/5显卡SFFT驱动1.5版For Win2000/XP/XP-64 万能网卡驱动兼容win7 / xp 万能网卡驱动兼容win7 / xp 万能网卡驱动兼容win7 / xp万能网卡驱动兼容win7 / xp 万能网卡驱动兼容win7 / xp 万能网卡驱动兼容win7 / xp万能网卡驱动兼容win7 / xp万能网卡驱动兼容win7 / xp万能网卡驱动兼容win7 / xp

33,008

社区成员

发帖
与我相关
我的任务
社区描述
数据结构与算法相关内容讨论专区
社区管理员
  • 数据结构与算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧