int main(int argc, char ** argv) { bitset<OptionFlagNum> mode; string prog; int opt, diff = 0; while (( opt = getopt(argc, argv, "hleg")) != -1) { switch (opt) { case 'h': mode.set( MODE_HELP ); break; case 'e': mode.set( OPTION_EMIT ); break; case 'l': mode.set( OPTION_LABELS ); break; case 'g': mode.set( OPTION_GENOME ); break; } } if ( mode[MODE_HELP] ) { usage(); exit(0); } char *name; for (; optind<argc; optind++) if (argv[optind]) name = argv[optind]; ifstream ifs( name ); if (!ifs) if (!mode[OptionFlagNum]) { test(); exit(1); } else { usage(); exit(1); } char c; while (ifs.get(c)) { switch(c) { case ' ' : prog+='A'; break; case '\t': prog+='B'; break; case '\n': prog+='C'; break; } } map<string, int> labels; VT tokens; int pos = 0; while ( !prog.empty() ) { Token tok = lexer(prog, pos); tokens.push_back(tok); if ( tok.get_id() == CAAP ) labels[ tok.get_param() ] = tok.get_pos(); } if ( mode[OPTION_LABELS] ) debug_labels(tokens, labels); if ( mode[OPTION_EMIT] ) debug_print(tokens, labels); if ( mode[OPTION_GENOME] ) debug_print_as_genome(tokens); if ( mode[OPTION_LABELS] | mode[OPTION_EMIT] | mode[OPTION_GENOME] ) cout << endl << " <===--- RUN PROGRAM ---===>" << endl << endl; interprete(tokens, labels); }
void backtrack(VVI& dp, VT& res, VT& A, VT& B, int i, int j) { if(!i || !j) return; if(A[i-1] == B[j-1]) { res.push_back(A[i-1]); backtrack(dp, res, A, B, i-1, j-1); } else { if(dp[i][j-1] >= dp[i-1][j]) backtrack(dp, res, A, B, i, j-1); else backtrack(dp, res, A, B, i-1, j); } }
void test() { map<string, int> labels; VT tokens; int pos = 0; /* test program */ string prog = string("AAACAAABAABAAACBBAAAABCAAABBAABABCBBAAAABACAAA") + "BBABBAACBBAAAABBCAAABBABBAACBBAAAABAACAAABBABBBBCBBAAAAB" + "ABCAAABABBAACBBAAAABBACAAABAAAAACBBAAAABBBCAAABBBABBBCBB" + "AAAABAAACAAABBABBBBCBBAAAABAABCAAABBBAABACBBAAAABABACAAA" + "BBABBAACBBAAAABABBCAAABBAABAACBBAAAABBAACAAABAAAAACBBAAA" + "ABBABCAAABBABBBBCBBAAAABBBACAAABBAABBACBBAAAABBBBCAAABAA" + "AAACBBAAAABAAAACAAABBBAABBCBBAAAABAAABCAAABBBAAAACBBAAAA" + "BAABACAAABBAAAABCBBAAAABAABBCAAABBAAABBCBBAAAABABAACAAAB" + "BAABABCBBAAAABABABCAAABBBAABBCBBAAAABABBACAAABAAAABCBBAA" + "AABABBBCAAAACBBAAAAACCABABBBABBBABBBAABAABBABAABABBBABAA" + "ABBAABABCCABABBABBBAABBAABABABBBABBBABBABBAAABBABAABABBA" + "BBBAABBAABABCCCCCAAABBAAAABABBAABAAABBAABAACBAAACBCCAAAB" + "BBABBBABBBAABAABBABAABABBBABAAABBAABABCACABBBACACBAABBBA" + "BBBABBBAABAABBABAABABBBABAAABBAABABABABBBBBABBAABABABBAB" + "BBAABBAABAACBCAAAAABCBAAACACABBBABBBABBBAABAABBABAABABBB" + "ABAAABBAABABCCAAABBBABBBABBBAABAABBABAABABBBABAAABBAABAB" + "ABABBBBBABBAABABABBABBBAABBAABAACACCACCCBCCAAABBBAABAABB" + "AABABABBAAAABABBAABAACACAACABCBABBBACAAAABABACBAABCBAABB" + "BAABAABBAABABABBAAAABABBAABAAABABBBBBABBAABABABBABBBAABB" + "AABAACACCAAABCBAAACACABBBAABAABBAABABABBAAAABABBAABAACCA" + "AABBBAABAABBAABABABBAAAABABBAABAAABABBBBBABBAABABABBABBB" + "AABBAABAACACCAAABCBAAAAAAACBBACBCCAAABBABBBAABBAABABABBB" + "ABBBABBABBAAABBABAABABBABBBAABBAABABCAAABABACAAABBABCBCA" + "ABCAACBC"; while ( !prog.empty() ) { Token tok = lexer(prog, pos); tokens.push_back(tok); if ( tok.get_id() == CAAP ) labels[ tok.get_param() ] = tok.get_pos(); } usage(); debug_labels(tokens, labels); debug_print(tokens, labels); debug_print_as_genome(tokens); cout << endl << " <===--- RUN PROGRAM ---===>" << endl << endl; interprete(tokens, labels); }
VT BRAIN::top () const { VT vt; PBC smass = infop->area.getmass (infop->getlastpos (), infop->getlastclr ()); PBC smass_his = infop->area.getmass (smass.first, infop->turn ()); PBC fmass = infop->father->area.getmass (smass.first, infop->getlastclr ()); PBC fmass_his = infop->father->area.getmass (smass.first, infop->turn ()); // 断事件,必然有异块半联(即断)已块半联(即断),可能有已块联络(全联) BITB cut = infop->cutpos (infop->getlastclr ()).blockon (infop->getlastpos ()); if (cut[infop->getlastpos ()]) { PBC f_his = infop->father->area.getmass (cut, infop->turn ()); PBC s_my = infop->area.getmass (cut, infop->getlastclr ()); vt.push_back (TARGET (DUAN, INT_MAX, f_his, s_my)); //被断者,断者 } // 已块联络,落在父的什么色区都有可能 if (fmass.first.blockcount () > 1) vt.push_back (TARGET (LIANLUO, INT_MAX, fmass, smass)); //联络对象,联络效果 // 异块隔开,落在父的什么色区都有可能 if (fmass_his.first.blockcount () < smass_his.first.blockcount ()) vt.push_back (TARGET (GE, INT_MAX, fmass_his, smass)); //隔开对象,阻隔者 return vt; }
void backtrackall(VVI& dp, set<VT>& res, VT& A, VT& B, int i, int j) { if(!i || !j) { res.insert(VI()); return; } if(A[i-1] == B[j-1]) { set<VT> tempres; backtrackall(dp, tempres, A, B, i-1, j-1); for(set<VT>::iterator it=tempres.begin(); it!=tempres.end(); it++) { VT temp = *it; temp.push_back(A[i-1]); res.insert(temp); } } else { if(dp[i][j-1] >= dp[i-1][j]) backtrackall(dp, res, A, B, i, j-1); if(dp[i][j-1] <= dp[i-1][j]) backtrackall(dp, res, A, B, i-1, j); } }
TARGETS operator ~ (TARGETS a) { vector < TARGETS > vts (a.nut.size ()); VT vt; for (int i = 0; i < a.nut.size (); ++i) //将 a.nut 按行(与结构)每个元素取~后 for (int j = 0; j < a.nut[i].size (); ++j) { //竖排(或结构)形成一个targets, 共a.nut.size()个 vt.clear (); vt.push_back (~a.nut[i][j]); vts[i].nut.push_back (vt); } TARGETS tmp = vts[0]; for (int i = 1; i < vts.size (); ++i) //将这些targets连& tmp = tmp & vts[i]; for (int i = 0; i < tmp.nut.size (); ++i) //归整每行(与结构) unique (tmp.nut[i].begin (), tmp.nut[i].end ()); unique (tmp.nut.begin (), tmp.nut.end ()); //归整所有行(或结构) return tmp; }