胡牌算法(抄袭)

#include <iostream>
using namespace std;

bool CanHu(int allPai[4][10]);

bool Analyze(int pai[], bool zipai);

int main(int argc, char *argv[])
{
	int allPai[4][10];
	
	int i = 0;
	int j = 0;

	for (i = 0; i < 4; i ++) {
		
		for (j = 0; j < 10; j ++) {
			
			allPai[i][j] = 0;
		}
	}

	int majiang[14] = {1, 1, 2, 2, 3, 3, 3, 4, 5, 25, 26, 27, 32, 32};
	int base = 0;
	int index = 0;
	for (i = 0; i < 14; i ++) {
		
		if (majiang[i]>=1 && majiang[i]<=9) {
			base = 0;
			index = 0;
		}
		else if (majiang[i]>=11 && majiang[i]<=19) {
			base = 10;
			index = 1;
		}
		else if (majiang[i]>=21 && majiang[i]<=29) {
			base = 20;
			index = 2;
		}
		else if (majiang[i]>=31 && majiang[i]<=37) {
			base = 30;
			index = 3;
		}
	
		allPai[index][majiang[i]-base]++;
		allPai[index][0]++;
	}
	
	if (CanHu(allPai)) {
		
		cout<<"CanHU"<<endl;	
	}
	else {
		cout<<"NOt HU"<<endl;	
	}
	
	return 0;
}

bool CanHu(int allPai[4][10])
{
	int jiangPos;			//将的位置
	int yuShu;			//余下的数
	bool jiangExisted = false;	//将是否存在
	
	//是否满足3, 3, 3, 3, 2的模式
	int i = 0;
	for (i = 0; i < 4; i ++) {
	
		yuShu = allPai[i][0] % 3;
		
		if (yuShu == 1) {
		
			return false;
		}
		
		if (yuShu == 2) {
			
			if (jiangExisted) {
				
				return false;
			}
			jiangPos = i;
			jiangExisted = true;
		}
	}

	for (i = 0; i < 4; i ++) {
	
		if (i != jiangPos) {
		
			if (!Analyze(allPai[i], i == 3)) {
			
				return false;
			}
		}
	}
	
	bool success = false;
	int j = 1;
	for (j = 1; j < 10; j ++) {
	
		if (allPai[jiangPos][j] >= 2) {
			
			//除去这两张牌
			allPai[jiangPos][j] -= 2;
			allPai[jiangPos][0] -= 2;
			
			if (Analyze(allPai[jiangPos], jiangPos == 3)) {
			
				success = true;
			}

			//还原这两张牌
			allPai[jiangPos][j] += 2;
			allPai[jiangPos][0] += 2;
			if (success)
				break;
		}	
	}

	return success;
}

//分解
bool Analyze(int aKindPai[], bool zipai)
{
	if (aKindPai[0] == 0) {
		
		return true;	
	}

	//寻找第一张字牌
	int j = 1;
	for (j = 1; j < 10; j ++) {
		
		if (aKindPai[j] != 0) 
			break;
	}

	bool result;
	if (aKindPai[j] >= 3)	//作为壳子
	{
		aKindPai[j] -= 3;
		aKindPai[0] -= 3;
		result = Analyze(aKindPai, zipai);
		//还原这三张
		aKindPai[j] += 3;
		aKindPai[0] +=3;
		return result;
	}

	//作为顺牌
	if ((!zipai) && (j < 8) 
		&& (aKindPai[j+1] > 0)
		&& (aKindPai[j+2]) > 0)
 	{
		//除去这三张
		aKindPai[j] --;
		aKindPai[j+1] --;
		aKindPai[j+2] --;
		aKindPai[0] -= 3;
		result = Analyze(aKindPai, zipai);
		//还原这三张顺子
		aKindPai[j] ++;
		aKindPai[j+1] ++;
		aKindPai[j+2] ++;
		aKindPai[0] += 3;
		return result;
	}

	return false;
}

你可能感兴趣的:(胡牌算法(抄袭))