筆記試験問題-トランプの5つ以上の連続数値のカードの数を検索します

2633 ワード

タイトルの説明
大きさの王を含まない普通のトランプを仮定すると,A,2,3,4,5,6,7,8,9,10,J,Q,Kはそれぞれ1−13のトランプ数値を表す.網易内部では,順子が5個以上の連続数値のカードからなる新しい遊び方が開発された.A-2-3-4-5のように、8-9-10-J-Q-Kはいずれも定義に合致する順子であるが、10-J-Q-K-Aは定義に合致せず、順子ではない.
現在の手札を与えて、私たちは何種類の順子を共有する案を知りたいと思っています.異なるカード組成の同じ順子は、3 3 3 4 5 6 7のような異なるスキームと見なされ、2つの異なる(3,4,5,6,7)順子を構成することができる.
説明の入力
各入力データには、複数のテストポイントが含まれています.第1挙動試験点の個数T(T<=50).各試験点について、第1の挙動の整数N(0の次の行はN個の異なる数値(A,2,3,4,5,6,7,8,9,10,J,Q,Kで表される)を含み、手札の数値を表す.同じ数値が4回を超えないことを保証します.
出力の説明
各テストポイントについて、可能な順子スキーム数を出力します.
問題を解く構想.
長さ13の配列を確立し,A,2,3,4,5,6,7,8,9,10,J,Q,Kの出現回数を保存した.連続長が5以上の最上位シーケンスの開始位置と終了位置を配列内で検索します.開始位置から終了位置までのシナリオ数を計算します.
#include 
#include 
#include 

using namespace std;

int factor(int begin, int end, int a[])
{
	int ret = 1;
	for (int i = begin; i <= end; i++){
		ret = ret * a[i];
	}
	return ret;
}

int searchCnt(int begin, int end, int a[])
{
	int ret = factor(begin, end, a);
	int len = end - begin + 1;
	for (int i = 5; i < len; i++){
		for (int j = 0; j <= len - 5; j++){
			ret = ret + factor(begin + j, begin + i + j - 1, a);
		}
	}
	return ret;
}

bool isShunzi(int& begin, int& end, int& len, bool& flag, int a[])
{
	bool endFlag = false;
	len = 0;
	for (int k = 0; k < 13; k++){
		if (a[k] != 0){
			if (len == 0) begin = k;
			len++;
		}
		else{
			if (len >= 5){
				end = k - 1;
				flag = true;
				break;
			}
			len = 0;
		}
		if (k == 12) endFlag = true;
	}
	return endFlag;
}

int main()
{
	int n;
	cin >> n;
	for (int i = 0; i < n; i++)
	{
		int len;
		cin >> len;
		string tmp;
		int count[13] = { 0 };
		for (int j = 0; j < len; j++){
			cin >> tmp;

			if (tmp == "A")	count[0]++;
			else if (tmp == "10")	count[9]++;
			else if (tmp == "J")	count[10]++;
			else if (tmp == "Q")	count[11]++;
			else if (tmp == "K")	count[12]++;
			else if ("2" <= tmp && tmp <= "9")  count[tmp[0] - '1']++;
			else{
				cout << "paraneter is invalid ..." << endl;
			}
		}

		int ret = 0;

		int length = 0, begin = 0, end = 0;
		bool flag = false, endFlag = false;
		while (!isShunzi(begin, end, length, endFlag, count))
		{
			ret = searchCnt(begin, end, count);
			begin = end + 1;
			length = 0;
			if (endFlag) break;
		}
		cout << ret << endl;
	}
	return 0;
}

お父さんの所
上記のコードは、ローカルデバッグ時に与えられたテストサンプルは完全に合格したが、アップロードされたコードの通過率はゼロだった(入力の制限条件を追加しなかったから?愚か..).ローカルで考えられるテストサンプルはすべて試したが、問題は発見されなかった.テストミスの例を見つけたら、この解法がどこで間違っているのか教えてください.