boj1924 麻将判胡

265 篇文章 1 订阅
2 篇文章 0 订阅

把对错两个程序都贴上来对比一下,快速定位bug的能力还是有些差:

错误程序(虽然考虑到了牌不超过5张,但是写的位置不对):

#include<iostream>
#include<stdio.h>
#include<string.h>
#include<math.h>
#include<vector>
#include<algorithm>
#include<functional>
#include<queue>
using namespace std;

int ting[30]={0};
int pai[30]={0};
int paibak[30]={0};
bool Hu(int num,int flag){
	int i,j,res;
	if(num==0&&flag)
		return true;
	else{
		i=0;
		while(i<30){
			if( pai[i]!=0 ){
/*********************就是这里相当于没写********************/                
                if( pai[i]>=5 ){
                    
                    return false;
                }
/*********************就是这里相当于没写********************/    				
				if(  pai[i]>=3  ){

					pai[i]-=3;
					res=Hu( num-3,flag );
					pai[i]+=3;
					
					if(res)
						return true;

				}
				if( pai[i]>=2 && flag==0 ){
					
					flag=1;
					pai[i]-=2;
					res=Hu( num-2,flag );
					pai[i]+=2;
					flag=0;
					if(res)
						return true;

				}
				if( pai[i]>=1&&i<28 &&pai[i+1]>=1 &&pai[i+2]>=1  ){
					

					pai[i]--;		pai[i+1]--;        pai[i+2]--;
					res=Hu( num-3,flag );
					pai[i]++;		pai[i+1]++;        pai[i+2]++;
					if(res)
						return true;
				}

			}
			i++;
		}
		
		if(i==30)
			return false;
	}
}




int main(){
	
	int T,i,j,k,a,F,tt;
	char c;

	scanf("%d",&T);
	for(i=0;i<T;i++){
		memset(pai,0,sizeof(pai));
		memset(paibak,0,sizeof(paibak));
		memset(ting,0,sizeof(ting));
		for(j=0;j<13;j++){
			scanf("%d%c",&a,&c);
			//s<t<w
			if( c=='t' )
				a+=10;
			if( c=='w' )
				a+=20;
			pai[a]++;
			paibak[a]++;
		}
		
		for(j=1;j<10;j++)
			for(k=0;k<=20;k+=10){
				if(j+k==25){
					pai[j+k]=pai[j+k];
				}

				pai[j+k]++;
				if( Hu( 14,0 ) ){
					ting[ j+k ]=1;
					for(tt=0;tt<30;tt++){
						pai[tt]=paibak[tt];
					}
				}
				else
					pai[j+k]--;
			}
			
		F=0;
		for(j=1;j<10;j++)
			for(k=0;k<=20;k+=10){
				if( ting[j+k] ){
					if(F==0){
						printf("Yes");
						F=1;
					}

					printf(" %d",j);
					if( k==10 )
						printf("t");
					else if( k==20 )
						printf("w");
					else 
						printf("s");					
				}
			}
		if(F==0)
			printf("No");
		printf("\n");

	}
	system("pause");
	return 0;
}




错误的输入输出:

20
1w 4w 7w 1s 2s 3s 4s 5s 7s 9s 1s 3s 8t
No
7w 7w 7w 7w 8w 9w 8w 9w 1s 1s 1s 2s 2s
Yes 2s
1w 2w 3w 4w 5w 6w 7w 8w 9w 2s 3s 3s 4s
Yes 3s
1w 4w 4w 4w 5w 5w 5w 7s 7s 7s 8s 8s 8s
Yes 1w
1w 2w 3w 4w 5w 6w 7w 8w 9w 3t 3t 3t 8t
Yes 8t
4w 4w 4w 5w 5w 5w 7s 7s 7s 8s 8s 1w 1w
Yes 1w 8s
1w 2w 3w 4w 5w 6w 7w 8w 9w 3t 4t 5t 6t
Yes 3t 6t
1w 2w 3w 4w 5w 6w 7w 8w 9w 3t 3t 3t 4t
Yes 2t 4t 5t
1w 1w 1w 4s 4s 4s 2t 3t 4t 5t 6t 9t 9t
Yes 1t 4t 7t
1t 1t 1t 1w 1w 1w 3w 4w 5w 6w 8w 8w 8w
Yes 2w 3w 6w 7w
1t 1t 1t 2w 2w 2w 3w 4w 4w 4w 5w 5w 6w
Yes 3w 4w 6w 7w
1t 1t 1t 1s 1s 1s 2w 2w 2w 3w 4w 4w 4w
Yes 1w 2w 3w 4w 5w
1t 1t 1t 1w 1w 1w 2w 3w 3w 4w 5w 5w 5w
Yes 1w 2w 3w 4w 5w
1t 1t 1t 2w 3w 4w 4w 5w 6w 7w 8w 8w 8w
Yes 1w 3w 4w 6w 7w 9w
1t 1t 1t 2w 2w 2w 3w 4w 5w 6w 6w 7w 8w
Yes 1w 3w 4w 6w 7w 9w
2w 2w 2w 3w 4w 4w 4w 4w 5w 6w 7w 7w 7w
Yes 1w 2w 3w 4w 5w 6w 7w 8w
3w 3w 3w 4w 4w 5w 5w 6w 6w 7w 8w 8w 8w
Yes 2w 3w 4w 5w 6w 7w 8w 9w
2w 3w 3w 3w 3w 4w 4w 5w 6w 7w 8w 8w 8w
Yes 1w 2w 3w 4w 5w 6w 7w 8w 9w
2w 2w 2w 3w 4w 5w 6w 7w 7w 7w 4t 5t 6t
Yes 1w 2w 3w 4w 5w 6w 7w 8w
1w 1w 1w 2w 3w 4w 5w 6w 7w 8w 9w 9w 9w
Yes 1w 2w 3w 4w 5w 6w 7w 8w 9w
请按任意键继续. . .

AC程序:

#include<iostream>
#include<stdio.h>
#include<string.h>
#include<math.h>
#include<vector>
#include<algorithm>
#include<functional>
#include<queue>
using namespace std;

int ting[30]={0};
int pai[30]={0};
int paibak[30]={0};


bool Hu(int num,int flag){
	int i,j,res;
	if(num==0&&flag)
		return true;
	else{
		for(i=0;i<30;i++)
			if( pai[i]>=5 )
				return false;

		i=0;
		while(i<30){
			if( pai[i]!=0 ){

				
				if(  pai[i]>=3  ){

					pai[i]-=3;
					res=Hu( num-3,flag );
					pai[i]+=3;
					
					if(res)
						return true;

				}
				if( pai[i]>=2 && flag==0 ){
					
					flag=1;
					pai[i]-=2;
					res=Hu( num-2,flag );
					pai[i]+=2;
					flag=0;
					if(res)
						return true;

				}
				if( pai[i]>=1&&i<28 &&pai[i+1]>=1 &&pai[i+2]>=1  ){

					pai[i]--;		pai[i+1]--;        pai[i+2]--;
					res=Hu( num-3,flag );
					pai[i]++;		pai[i+1]++;        pai[i+2]++;
					if(res)
						return true;
				}

			}
			i++;
		}
		
		if(i==30)
			return false;
	}
}
int main(){
	
	int T,i,j,k,a,F,tt;
	char c;
	scanf("%d",&T);
	for(i=0;i<T;i++){
		memset(pai,0,sizeof(pai));
		memset(paibak,0,sizeof(paibak));
		memset(ting,0,sizeof(ting));
		for(j=0;j<13;j++){
			scanf("%d%c",&a,&c);
			//s<t<w
			if( c=='t' )
				a+=10;
			if( c=='w' )
				a+=20;
			pai[a]++;
			paibak[a]++;
		}
		for(j=1;j<10;j++)
			for(k=0;k<=20;k+=10){
				pai[j+k]++;
				if( Hu( 14,0 ) ){
					ting[ j+k ]=1;
					for(tt=0;tt<30;tt++){
						pai[tt]=paibak[tt];
					}
				}
				else
					pai[j+k]--;
			}
		F=0;
		for(j=1;j<10;j++)
			for(k=0;k<=20;k+=10){
				if( ting[j+k] ){
					if(F==0){
						printf("Yes");
						F=1;
					}
					printf(" %d",j);
					if( k==10 )
						printf("t");
					else if( k==20 )
						printf("w");
					else 
						printf("s");					
				}
			}
		if(F==0)
			printf("No");
		printf("\n");

	}
	//system("pause");
	return 0;
}


测试用例为:

20
1w 4w 7w 1s 2s 3s 4s 5s 7s 9s 1s 3s 8t
7w 7w 7w 7w 8w 9w 8w 9w 1s 1s 1s 2s 2s
1w 2w 3w 4w 5w 6w 7w 8w 9w 2s 3s 3s 4s
1w 4w 4w 4w 5w 5w 5w 7s 7s 7s 8s 8s 8s
1w 2w 3w 4w 5w 6w 7w 8w 9w 3t 3t 3t 8t
4w 4w 4w 5w 5w 5w 7s 7s 7s 8s 8s 1w 1w
1w 2w 3w 4w 5w 6w 7w 8w 9w 3t 4t 5t 6t
1w 2w 3w 4w 5w 6w 7w 8w 9w 3t 3t 3t 4t
1w 1w 1w 4s 4s 4s 2t 3t 4t 5t 6t 9t 9t
1t 1t 1t 1w 1w 1w 3w 4w 5w 6w 8w 8w 8w
1t 1t 1t 2w 2w 2w 3w 4w 4w 4w 5w 5w 6w
1t 1t 1t 1s 1s 1s 2w 2w 2w 3w 4w 4w 4w
1t 1t 1t 1w 1w 1w 2w 3w 3w 4w 5w 5w 5w
1t 1t 1t 2w 3w 4w 4w 5w 6w 7w 8w 8w 8w
1t 1t 1t 2w 2w 2w 3w 4w 5w 6w 6w 7w 8w
2w 2w 2w 3w 4w 4w 4w 4w 5w 6w 7w 7w 7w
3w 3w 3w 4w 4w 5w 5w 6w 6w 7w 8w 8w 8w
2w 3w 3w 3w 3w 4w 4w 5w 6w 7w 8w 8w 8w
2w 2w 2w 3w 4w 5w 6w 7w 7w 7w 4t 5t 6t
1w 1w 1w 2w 3w 4w 5w 6w 7w 8w 9w 9w 9w






评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值