列表

详情


ZJ20. 雀魂启动!

描述

小包最近迷上了一款叫做雀魂的麻将游戏,但是这个游戏规则太复杂,小包玩了几个月了还是输多赢少。
于是生气的小包根据游戏简化了一下规则发明了一种新的麻将,只留下一种花色,并且去除了一些特殊和牌方式(例如七对子等),具体的规则如下:

  1. 总共有36张牌,每张牌是1~9。每个数字4张牌。
  2. 你手里有其中的14张牌,如果这14张牌满足如下条件,即算作和牌

例如:
1 1 1 2 2 2 6 6 6 7 7 7 9 9 可以组成1,2,6,7的4个刻子和9的雀头,可以和牌
1 1 1 1 2 2 3 3 5 6 7 7 8 9 用1做雀头,组123,123,567,789的四个顺子,可以和牌
1 1 1 2 2 2 3 3 3 5 6 7 7 9 无论用1 2 3 7哪个做雀头,都无法组成和牌的条件。

现在,小包从36张牌中抽取了13张牌,他想知道在剩下的23张牌中,再取一张牌,取到哪几种数字牌可以和牌。

输入描述

输入只有一行,包含13个数字,用空格分隔,每个数字在1~9之间,数据保证同种数字最多出现4次。

输出描述

输出同样是一行,包含1个或以上的数字。代表他再取到哪些牌可以和牌。若满足条件的有多种牌,请按从小到大的顺序输出。若没有满足条件的牌,请输出一个数字0

示例1

输入:

1 1 1 2 2 2 5 5 5 6 6 6 9

输出:

9

说明:

可以组成1,2,6,7的4个刻子和9的雀头

示例2

输入:

1 1 1 1 2 2 3 3 5 6 7 8 9

输出:

4 7

说明:

用1做雀头,组123,123,567或456,789的四个顺子

示例3

输入:

1 1 1 2 2 2 3 3 3 5 7 7 9

输出:

0

说明:

来任何牌都无法和牌

原站题解

C 解法, 执行用时: 1ms, 内存消耗: 368KB, 提交时间: 2021-04-25

#include<stdio.h>
int main(){
    int num[10]={0},n,k,a[10]={0},s=0,flag=0;
    for(int i=0;i<13;i++){
        scanf("%d",&n);
        num[n]++;
    }  
    for(int i=1;i<10;i++){
        if(num[i]==4) continue;
        num[i]++;
       for(int j=1;j<10;j++){
           for(int k=1;k<10;k++) a[k]=num[k];
           s=i;
           int f=0;
           if(a[j]>=2){
            a[j]-=2;
            for(int k=1;k<10;k++){
                if(a[k]>=3){
                    a[k]-=3;
                    f++;
                }
                while(a[k]>0&&a[k+1]>0&&a[k+2]>0){
                    a[k]--;
                    a[k+1]--;
                    a[k+2]--;
                    f++;
                }
                if(a[k-1]>0&&a[k-1]<3&&k>1) break;
            }
        }
           if(f==4) break;
           s=0;
       }
        if(s!=0){
            printf("%d ",s);
            flag=1;
        }
        num[i]--;
    }
   if(flag==0) printf("0");
    printf("\n");
    return 0;
}

C 解法, 执行用时: 1ms, 内存消耗: 376KB, 提交时间: 2020-07-22

#include<stdio.h>
int main(){
	int ans=0,a[10]={0},i,j,k,temp,b[12]={0},flag=0;
	for(i=0;i<13;i++){
		scanf("%d",&temp);
		a[temp]++;
	}
	for(k=1;k<10;k++){
		if(a[k]==4) continue;
		a[k]++;
//		printf("添加%d\n",k);
		for(i=1;i<10;i++){
			for(j=1;j<10;j++) b[j] = a[j];
//			for(j=1;j<10;j++) printf("%d ",b[j]);
//			printf("\n");
			ans = k;
			int f=0;
			if(b[i]>=2){
				b[i]-=2;
//				printf("雀头为%d\n",i);
				for(j=1;j<10;j++){
					if(b[j]>=3) {
						b[j]-=3;
						f++;
//						printf("去掉3个%d,还剩下%d个\n",j,b[j]);
					}
					while(b[j]>0&&b[j+1]>0&&b[j+2]>0){
						b[j]--;
						b[j+1]--;
						b[j+2]--;
						f++;
//						printf("%d %d %d\n",j,j+1,j+2);
					}
					if(b[j-1]>0&&b[j-1]<3&&j>1) break;
				}
			}
				if(f==4) break;
				ans = 0;
		}	
	if(ans!=0){
		printf("%d ",ans);
		flag=1;
	}
	a[k]--;
	}
	if(flag==0) printf("0"); 
	printf("\n");
	return 0;
}

上一题