makeplex salon:あなたのスキルで飯は食えるか? 史上最大のコーディングスキル判定 (1/2) - ITmedia エンタープライズ
↑やってみた。
1時間かかったか掛からなかったくらい。しかし気でも狂ったんじゃないかというレベルの悲惨なソース。久々に載せて恥ずかしいソースだと思った。
#include <iostream> #include <vector> #include <algorithm> #include <set> #include <sstream> using namespace std; typedef pair<vector<string>,string> ans_t; int limit[10]; vector<string> now; set<ans_t> ans; vector<string> able; vector<string> ableHead; vector<int> allCount(vector<string>tmp){ vector<int> ret(10,0); for(int si=0;si<tmp.size();si++){ for(int i=0;i<tmp[si].length();i++){ ret[tmp[si][i]-'0']++; } } return ret; } bool malCheck(vector<string> tmp){ vector<int> t = allCount(tmp); for(int i=0;i<10;i++){ if(t[i]>limit[i])return true; } return false; } bool wantCheck(string s){ if(s[1]==s[0]+1|| s[0] == s[1])return false; return true; } void bt1(){ /* 規定オーバーしたら抜け出し */ if(malCheck(now))return; /* 4コ 面子がそろったなら */ if(now.size() == 4){ vector<int> t = allCount(now); for(int i=0;i<10;i++){ if(limit[i]-t[i]){ string sst="";sst+='0'+i; sort(now.begin(),now.end()); ans.insert(make_pair(now,sst)); } } return; } for(int i=0;i<able.size();i++){ vector<string> t = now; now.push_back(able[i]); bt1(); now = t; } } void bt2(){ /* 規定オーバーしたら抜け出し */ if(malCheck(now))return; /* 4コ 面子がそろったなら */ if(now.size() == 4){ vector<int> t = allCount(now); string sst=""; for(int i=0;i<10;i++){ if(limit[i]-t[i]){ sst+='0'+i; } } if(sst.size()==1)sst+=sst; if(wantCheck(sst))return; sort(now.begin(),now.end()); ans.insert(make_pair(now,sst)); return; } for(int i=0;i<able.size();i++){ vector<string> t = now; now.push_back(able[i]); bt2(); now = t; } } int main(){ string s,chk; cin >> s; sort(s.begin(),s.end()); chk = s; chk.erase(unique(chk.begin(),chk.end()),chk.end()); /*個数数え*/ for(int i=0;i<s.length();i++)limit[s[i]-'0']++; /* 刻子 と 頭 */ for(int i=0;i<chk.length();i++){ /* 刻子 */ if(count(s.begin(),s.end(),chk[i]) >= 3){ string t=""; t+=chk[i];t+=chk[i];t+=chk[i]; able.push_back(t); } /* 頭 */ if(count(s.begin(),s.end(),chk[i]) >= 2){ string t=""; t+=chk[i];t+=chk[i]; ableHead.push_back(t); } } /* 順子 */ for(int i=0;i<chk.length()-2;i++){ if(chk[i+1]==chk[i]+1 && chk[i+2]==chk[i]+2){ string t=""; t+=chk[i];t+=chk[i]+1;t+=chk[i]+2; able.push_back(t); } } /* 単騎待ち探し */ bt1(); /* 頭待ち探し */ for(int i=0;i<ableHead.size();i++){ now.push_back(ableHead[i]); bt2(); now.pop_back(); } /* 出力 */ for(set<ans_t>::iterator it = ans.begin();it != ans.end();it++){ vector<string> t = (*it).first; for(int i=0;i<t.size();i++){ cout << "(" << t[i] << ")"; } cout << "[" << (*it).second << "]" << endl; } }