AOJ 0043 - Puzzle

PuzzleというかMahjangですね.

#include<iostream>
#include<vector>
#include<cstdio>
#include<cstring>

int ns[10];

void stringToN(std::string s){
	for(int i=1;i<=9;i++){//初期化
		ns[i] = 0;
	}
	for(int i=0;i<s.length();i++){
		ns[s[i]-'0']++;
	}
}

bool rec(int _ns[10], int remained_n, bool janto_flag){
	if(remained_n == 0){
		return true;
	}

	for(int i=1;i<=9;i++){
		if(_ns[i] >= 3){
			_ns[i] -= 3;
			if(rec(_ns, remained_n-3, janto_flag)){
				return true;
			}
			_ns[i] += 3;
		}
		
		if(i+2 <= 9 && _ns[i] && _ns[i+1] && _ns[i+2]){
			_ns[i]--;
			_ns[i+1]--;
			_ns[i+2]--;
			if(rec(_ns, remained_n-3, janto_flag)){
				return true;
			}
			_ns[i]++;
			_ns[i+1]++;
			_ns[i+2]++;
		}
		
		if(!janto_flag && _ns[i] >= 2){
			_ns[i] -= 2;
			if(rec(_ns, remained_n-2, true)){
				return true;
			}
			_ns[i] += 2;
		}
	}

	return false;
}

int main(){
	std::string s = "";
	while(std::cin >> s, !std::cin.eof()){
		stringToN(s);

		std::vector<int> res;
		for(int i=1;i<=9;i++){
			if(ns[i] <= 3){
				int _ns[10];
				memcpy(_ns, ns, sizeof(ns));
				_ns[i]++;
				if(rec(_ns, 14, false)){
					res.push_back(i);
				}
			}
		}

		if(res.size() == 0){
			puts("0");
		}else{
			printf("%d", res[0]);
			for(int i=1;i<res.size();i++){
				printf(" %d", res[i]);
			}
			puts("");
		}
	}
}