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(""); } } }