Download Brute Force Solution to Push Button Lock - Lecture Notes | COMP 157 and more Study notes Algorithms and Programming in PDF only on Docsity! COMP157 Fall 2007 brute force examples Sept. 17 Brute force solution to Push Button Lock: A Test is one possible assignment of buttons combinations: Recursively build all possible button combination assignments (including invalid ones). Check if a button combination assignment is valid: struct Test { int x[11]; int n; Test(int _n) { n = _n; } Test(const Test& o) { n=o.n; for (int i=0; i<o.n; i++) x[i]=o.x[i]; } }; void make_tests(int n, int max, vector<Test>& v) { if (n==1) { for (int j=0; j<=max; j++) { Test t(1); t.x[0] = j; v.push_back(t); } return; } vector<Test> v2; make_tests(n-1,max,v2); for (unsigned int i=0; i<v2.size(); i++) { Test copy(v2[i]); copy.n++; for (int j=0; j<=max; j++) { copy.x[n-1]=j; v.push_back(copy); } } } bool checkTest(Test& test) { int combos[11]; int n = 0; int i; for (i=0; i<test.n; i++) if (test.x[i]<test.n) { combos[n] = test.x[i]; n++; } sort(combos, n); if (combos[0] != 0) return false; for (i=0; i<n-1; i++) if ((combos[i+1]-combos[i])>1) return false; return true; } COMP157 Fall 2007 brute force examples Sept. 17 Solve the problem for a specific number of buttons: Official judge’s solution to Push Button Lock (not brute force?): int solve(int num_buttons) { // make vector containing all possible assignments vector<Test> v; make_tests(num_buttons, num_buttons, v); // count the number of valid assignments int count = 0; for (unsigned int i=0; i<v.size(); i++) if (checkTest(v[i])) count++; return count; } unsigned int max_move = 0; int savemove[16384]; unsigned long count(unsigned int used) { unsigned int move; unsigned int nMove = 0; if(savemove[used] > 0){ return(savemove[used]); } for (move = 1; move < max_move; move++) { if (move & used) { continue; } nMove++; nMove += count(used | move); } savemove[used] = nMove; return(nMove); } int solve(int num_buttons) { max_move = 1<<num_buttons; // 2^n ::memset(&(savemove[0]), '\0', sizeof(savemove)); return count(0); }