pdf版:include
以下テキスト版
#include <iostream> #include <vector> #include <numeric> using namespace std;
//面子のチェック
bool check_mentsu(int NUM, vector<int> &TEHAI, int MAISU){
if(MAISU == 0) return true;
for(int i=0;i<NUM;i++){
if(TEHAI[i] > 2){
vector<int> newTEHAI(TEHAI);
newTEHAI[i] = newTEHAI[i] - 3;
if(check_mentsu(NUM, newTEHAI, MAISU - 3)) return true;
}
if(i+2 < NUM && TEHAI[i] > 0 && TEHAI[i+1] > 0 && TEHAI[i+2] > 0){
vector<int> newTEHAI(TEHAI);
for (int j = 0; j < 3; j++) newTEHAI[i + j]--;
if(check_mentsu(NUM, newTEHAI, MAISU - 3)) return true;
}
}
return false;
}
//手直し版
bool check_mentsu2(int NUM, vector<int> &TEHAI, int MAISU){
vector<int> newTEHAI(TEHAI);
for(int i = 0; i < NUM; i++){
int amari = newTEHAI[i] % 3;
MAISU = MAISU - newTEHAI[i] + amari;
newTEHAI[i] = amari;
if(amari != 0 && TEHAI[i+1] >= amari && TEHAI[i+2] >= amari){
for(int j = 0; j < 3; j++)
newTEHAI[i+j] = newTEHAI[i+j] - amari;
MAISU = MAISU - (amari * 3);
}
else if(TEHAI[i+1] < amari || TEHAI[i+2] < amari)
return false;
}
if(MAISU == 0) return true;
else return false;
}
//雀頭のチェック
bool check_atama(int NUM, vector<int>& TEHAI, int MAISU){
for(int i=0;i<NUM;i++){
if(TEHAI[i] > 1){
vector<int> newTEHAI(TEHAI);
newTEHAI[i] = newTEHAI[i] - 2;
if (check_mentsu2(NUM, newTEHAI, MAISU - 2)) return true;
}
}
return false;
}
//上がれるかどうかのチェック
bool check_agari(){
int num; //持っている牌の種類数
//牌の種類数の入力
//0が入力されたらプログラムを終える
if (cin >> num && num < 1){
return false;
}
vector<int> tehai(num); //持っている牌を格納するためのvector
int maisu = 0;
for (int i = 0; i < num; i++) {
cin >> tehai[i];
maisu += tehai[i];
}
std::cout << (check_atama(num, tehai, maisu) ? "Yes" : "No") << std::endl;
return true;
}
int main(){
while (check_agari());
return 0;
}