/* Subject: Contest submission for problem #1, file 1.cc */ /* cyc@imail.EECS.Berkeley.EDU */ /* Wed Sep 17 21:30:09 PDT 2003 */ /*___CONTEST_SUBMISSION___ cyc 1 */ // CS198, Assignment 3, Problem 1 // By Chris Crutchfield // Start: 1:30 AM, Finish: 4:15 AM // Elapsed time: 2:45, Estimated time: 3:00 #include #include #include #include #include #define NULLCHAR1 '\n' #define NULLCHAR2 ' ' using namespace std; struct line { char assigned; vector used; vector next; vector prev; line() {assigned = NULLCHAR2;}; }; bool test_for_use(line *ln, char var) { if(ln == NULL) if(var == NULLCHAR1) return false; else return true; for(int i = 0; i < ln->used.size(); i++) for(int j = 0; j < ln->prev.size(); j++) if(test_for_use(ln->prev[j], ln->used[i])) return true; if(var != ln->assigned) for(int i = 0; i < ln->prev.size(); i++) if(test_for_use(ln->prev[i], var)) return true; return false; } void test_program(int setnum) { string trash; char tmp; int pos; vector keep_to_parse; vector program; vector used; for(int i = 0; ; i++) { cin >> trash; trash = ""; tmp = getchar(); while(tmp != ';') { if((tmp != '\n') && (tmp != ' ')) trash += tmp; tmp = getchar(); } keep_to_parse.push_back(trash); if(keep_to_parse[i].find("stop", 0) != string::npos) break; } program.resize(keep_to_parse.size()); for(int i = 0; i < program.size(); i++) program[i] = new line(); for(int i = 0; i < keep_to_parse.size(); i++) { used.resize(0); if(keep_to_parse[i].find("stop", 0) == string::npos) { for(pos = keep_to_parse[i].find("F(", 0)+2; keep_to_parse[i][pos] != ')'; pos++) if(keep_to_parse[i][pos] != ',') used.push_back(keep_to_parse[i][pos]); if((pos = keep_to_parse[i].find("goto", 0)) != string::npos) { pos = atoi((keep_to_parse[i].substr(pos + 4, keep_to_parse[i].length() - pos - 4)).c_str()); if(pos > i) program[i]->next.push_back(program[pos]); } else program[i]->assigned = keep_to_parse[i][0]; program[i]->used = used; program[i]->next.push_back(program[i+1]); } } program[0]->prev.push_back(NULL); for(int i = 0; i < program.size(); i++) for(int j = 0; j < program[i]->next.size(); j++) program[i]->next[j]->prev.push_back(program[i]); if(test_for_use(program[program.size() - 1], NULLCHAR1)) cout << "Set " << setnum << ": Possible use before definition" << endl; else cout << "Set " << setnum << ": No use before definition" << endl; } int main() { char tmp; for(int i = 0; !cin.eof(); i++) { test_program(i); cin >> tmp; } exit(0); }