麻将胡牌算法系列(一)
来源:互联网 发布:mysql where if函数 编辑:程序博客网 时间:2024/04/28 02:27
#include <stdio.h>
int Hu(int PAI[38]);
int Remain(int PAI[38]);
int main()
{
// °ÑÒ»¸±ÅÆ·ÅÔÚÏÂÃæµÄÊý×éÀ¿ÉÒÔÈÎÒâÌîÈëÊý×ÖÀ´²âÊÔº¯ÊýÕýÈ·Óë·ñ¡£
// ΪÁË·½±ã£¬PAI[0],PAI[10],PAI[20],PAI[30]¶¼ÆúÖ®²»Ó㬲¢ÇÒ±ØÐë
// ÖÃΪ0£¬Ç§Íò×¢Ò⣡
int PAI[38] = { 0,
1,1,1,0,1,1,1,0,0, // PAI[ 1- 9] Ò¼Íò¡«¾ÁÍòµÄ¸öÊý
0,
0,0,0,0,0,3,0,0,0, // PAI[11-19] Ҽ͡«¾Á͵ĸöÊý
0,
0,0,0,0,0,0,0,0,0, // PAI[21-29] Ò¼Ìõ¡«¾ÁÌõµÄ¸öÊý
0,
0,0,0,0,0,0,0 // PAI[31-37] ¶«ÄÏÎ÷±±Öз¢°×µÄ¸öÊý
};
// ÇëÎñ±ØÏÈÅųý¡°Æ߶ԡ± ºÍ¡°Ê®ÈýçÛ¡±£¬ÓÉÓÚ¼òµ¥£¬ËùÒÔ²»ÌṩÁË
// if( QIDUI(PAI) )...
// if( SHISANYAO(PAI) )...
if( Hu(PAI) )
printf("¹þ£¡ÎÒºÍÀ²£¡/n");
else
printf("°¥£¬ºÍ²»³É£¡/n");
return 1;
}
// ÅжϺÍÅƵĵݹ麯Êý£¬²»¿¼ÂÇ¡°Æ߶ԡ± ºÍ¡°Ê®ÈýçÛ¡±¡£ÒòΪÈç¹û
// °Ñ¡°Æ߶ԡ± ºÍ¡°Ê®ÈýçÛ¡±µÄÅжϷÅÔڵݹ麯ÊýÀ½«µÃ²»³¥Ê§¡£
int Hu(int PAI[38])
{
static int JIANG = 0; // ½«ÅƱêÖ¾£¬¼´ÅÆÐÍ¡°ÈýÈýÈýÈý¶þ¡±Öеġ°¶þ¡±
if( !Remain(PAI) ) return 1; // µÝ¹éÍ˳öÌõ¼þ£ºÈç¹ûûÓÐÊ£ÅÆ£¬ÔòºÍÅÆ·µ»Ø¡£
for(int i=1;!PAI[i]&&i<38;i++); // ÕÒµ½ÓÐÅƵĵط½£¬i¾ÍÊǵ±Ç°ÅÆ, PAI[i]ÊǸöÊý
printf("i = %d/n",i); // ¸ú×ÙÐÅÏ¢
// 4ÕÅ×éºÏ(¸Ü×Ó)
if ( PAI[i] == 4 ) // Èç¹ûµ±Ç°ÅÆÊýµÈÓÚ4ÕÅ
{
PAI[i] = 0; // ³ý¿ªÈ«²¿4ÕÅÅÆ
if( Hu(PAI) ) return 1; // Èç¹ûÊ£ÓàµÄÅÆ×éºÏ³É¹¦£¬ºÍÅÆ
PAI[i] = 4; // ·ñÔò£¬È¡Ïû4ÕÅ×éºÏ
}
// 3ÕÅ×éºÏ(´ó¶Ô)
if ( PAI[i] >= 3 ) // Èç¹ûµ±Ç°ÅƲ»ÉÙÓÚ3ÕÅ
{
PAI[i] -= 3; // ¼õÈ¥3ÕÅÅÆ
if( Hu(PAI) ) return 1; // Èç¹ûÊ£ÓàµÄÅÆ×éºÏ³É¹¦£¬ºÍÅÆ
PAI[i] += 3; // È¡Ïû3ÕÅ×éºÏ
}
// 2ÕÅ×éºÏ(½«ÅÆ)
if ( !JIANG && PAI[i] >= 2 ) // Èç¹û֮ǰûÓн«ÅÆ£¬ÇÒµ±Ç°ÅƲ»ÉÙÓÚ2ÕÅ
{
JIANG = 1; // ÉèÖý«ÅƱêÖ¾
PAI[i] -= 2; // ¼õÈ¥2ÕÅÅÆ
if( Hu(PAI) ) return 1; // Èç¹ûÊ£ÓàµÄÅÆ×éºÏ³É¹¦£¬ºÍÅÆ
PAI[i] += 2; // È¡Ïû2ÕÅ×éºÏ
JIANG = 0; // Çå³ý½«ÅƱêÖ¾
}
if ( i > 30 ) return 0; // ¡°¶«ÄÏÎ÷±±Öз¢°×¡±Ã»ÓÐ˳ÅÆ×éºÏ£¬²»ºÍ
// ˳ÅÆ×éºÏ£¬×¢ÒâÊÇ´ÓÇ°Íùºó×éºÏ£¡
if( i%10 != 8 && i%10 != 9 && // ÅųýÊýֵΪ8ºÍ9µÄÅÆ
PAI[i+1] && PAI[i+2] ) // Èç¹ûºóÃæÓÐÁ¬ÐøÁ½ÕÅÅÆ
{
PAI[i]--;
PAI[i+1]--;
PAI[i+2]--; // ¸÷ÅÆÊý¼õ1
if( Hu(PAI) ) return 1; // Èç¹ûÊ£ÓàµÄÅÆ×éºÏ³É¹¦£¬ºÍÅÆ
PAI[i]++;
PAI[i+1]++;
PAI[i+2]++; // »Ö¸´¸÷ÅÆÊý
}
// ÎÞ·¨È«²¿×éºÏ£¬²»ºÍ£¡
return 0;
}
// ¼ì²éÊ£ÓàÅÆÊý
int Remain(int PAI[38])
{
int sum = 0;
for(int i=1;i<38;i++)
sum += PAI[i];
return sum;
}
这个算法虽然简洁,但是有问题,没有考虑对子不存在的情况。如果没有把这种情况考虑进去当用在游戏中那就会出现判断出错,上面这个算法来自于网上某位朋友,经过我的改进,现在已经能判断正确的胡牌了,至于代码我就不贴出来了,每次来我空间访问的人基本上都是不回帖,我也就不把我的某些成果贴出来了。
- 麻将胡牌算法系列(一)
- 麻将胡牌算法
- 麻将的胡牌算法
- 麻将胡牌的算法
- 通用麻将胡牌算法
- 麻将简单胡牌算法
- 麻将洗牌算法系列(1)
- C++数据结构与算法——麻将胡牌算法(一:单花色胡牌)
- 麻将算法(一)洗牌
- 带百搭的麻将胡牌判断算法
- 癞子麻将胡牌算法实现
- 麻将胡牌算法的Java实现
- Unity3D 通用麻将胡牌算法
- Java实现的麻将胡牌算法
- Unity3D 通用麻将胡牌算法
- 麻将胡牌算法 不支持癞子
- 麻将听胡算法
- 麻将听牌算法
- 扩展欧几里德
- 带输入框的AlertDialog
- 我复习C 的记录
- 利用CLSID加密文件夹
- 诺基亚Nokia 5802将SIM的联系人/电话本/名片复制到手机
- 麻将胡牌算法系列(一)
- SQLServer2005中的OUTER JOIN 和 INNER JOIN 精析(上)
- 永生轮回之术
- 激励你一生的36句话
- jQuery异步加载实例
- 让一份童真永驻
- DM642 图像存储 问答
- 移植2.6.24内核
- 曙光并行机