程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> 11210 - Chinese Mahjong(dfs)

11210 - Chinese Mahjong(dfs)

編輯:C++入門知識

題目:11210 - Chinese Mahjong


題目大意:給出十三個麻將, 問再取哪一個能胡?把所有的情況列出來,並且按照題目要求的順序。胡的條件需要一個而且僅一個對,然後剩下要麼是三個相同的,要麼是三個連續的(前提是後綴相同,並且只有 T, S, W在考慮范圍內)


解題思路:把要取的情況一個個枚舉出來,然後dfs, 找是否加入這個可以胡就可以了,找的話就三種情況去判斷一下。但是要注意:三個連續要注意需要後綴相同,我這裡是把麻將轉成數字,然後統計這個麻將出現的次數,所以需要些邊界的判斷。


代碼:

#include 
#include 

const int N = 35;
const char s[7][7] = {"DONG", "NAN", "XI", "BEI", "ZHONG", "FA", "BAI"};
int tile[N];
char str[N];

int handle () {

	if (str[0] >= '1' && str[0] <= '9') {

		int add;
		switch (str[1]) {

			case 'T': add = 0;break;
			case 'S': add = 9;break;
			case 'W': add = 18;break;
		}
		return add + str[0] - '0';
	} else {

		int i;
		for (i = 0; i < 7; i++)
			if (strcmp(str, s[i]) == 0)
				break;
		return 28 + i;
	}
}

bool dfs (int k, int flag) {

	if (k >= 14) {

		if (flag)
			return true;
		return false;
	}
	for (int i = 1; i < N; i++) {

		if (tile[i] >= 2 && !flag) {

			tile[i] -= 2;
			if (dfs (k + 2, 1)) {

				tile[i] += 2;
				return true;
			} 
			tile[i] += 2;
		}
		if (tile[i] >= 3) {

			tile[i] -= 3;
			if (dfs (k + 3, flag)) {

				tile[i] += 3;
				return true;
			}
			tile[i] += 3;
		}
		if ( (i > 7&& i < 10) || (i > 16 && i < 19) || i > 25)
			continue;
		if (tile[i] >= 1 && tile[i + 1] >= 1 && tile[i + 2] >= 1) {

			tile[i]--;
			tile[i + 1]--;
			tile[i + 2]--;
			if (dfs (k + 3, flag)) {

				tile[i]++;
				tile[i + 1]++;
				tile[i + 2]++;
				return true;
			}
			tile[i]++;
			tile[i + 1]++;
			tile[i + 2]++;
		}
	}
	return false;
}

int main () {

	int ans[N], k, cas = 0;
	while (scanf ("%s", str)) {

		memset (tile, 0, sizeof(tile));
		k = 0;
		if (str[0] == '0')
			break;
		tile[handle()]++;
		for (int i = 0; i < 12; i++) {

			scanf ("%s", str);
			tile[handle()]++;
		}

		for (int i = 1; i < N; i++) {

			if (tile[i] >= 4)
				continue;
			tile[i]++;
			if (dfs (0, 0))
				ans[k++] = i;
			tile[i]--;
		}
	
		printf ("Case %d: ", ++cas);
		if (!k) {

			printf ("Not ready\n");
			continue;
		}
		for (int i = 0; i < k; i++) {

			if (i < k - 1) {

				if (ans[i] >= 1 && ans[i] <= 9)
					printf ("%dT ", ans[i]);
				else if (ans[i] >= 10 && ans[i] <= 18)
					printf ("%dS ", ans[i]- 9);
				else if (ans[i] >= 19 && ans[i] <= 27)
					printf ("%dW ", ans[i] - 18);
				else
					printf ("%s ", s[ans[i] - 28]);
			} else {

				if (ans[i] >= 1 && ans[i] <= 9)              	
					printf ("%dT\n", ans[i]);
				else if (ans[i] >= 10 && ans[i] <= 18)          
					printf ("%dS\n", ans[i] - 9);
				else if (ans[i] >= 19 && ans[i] <= 27)
					printf ("%dW\n", ans[i] - 18);   
				else
					printf ("%s\n", s[ans[i] - 28]);
			}
		}
	}
}


  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved