麻将胡牌算法系列(一)

来源:互联网 发布: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;
}

 

 

这个算法虽然简洁,但是有问题,没有考虑对子不存在的情况。如果没有把这种情况考虑进去当用在游戏中那就会出现判断出错,上面这个算法来自于网上某位朋友,经过我的改进,现在已经能判断正确的胡牌了,至于代码我就不贴出来了,每次来我空间访问的人基本上都是不回帖,我也就不把我的某些成果贴出来了。