Docsity
Docsity

Prepare for your exams
Prepare for your exams

Study with the several resources on Docsity


Earn points to download
Earn points to download

Earn points by helping other students or get them with a premium plan


Guidelines and tips
Guidelines and tips

Brute Force Solution to Push Button Lock - Lecture Notes | COMP 157, Study notes of Algorithms and Programming

Material Type: Notes; Class: Design/Analysis of Algorithms; Subject: Computer Science; University: University of the Pacific; Term: Fall 2007;

Typology: Study notes

Pre 2010

Uploaded on 08/18/2009

koofers-user-5dn
koofers-user-5dn 🇺🇸

5

(1)

10 documents

1 / 3

Toggle sidebar

This page cannot be seen from the preview

Don't miss anything!

bg1
COMP157Fall2007bruteforceexamplesSept.17
BruteforcesolutiontoPushButtonLock:
ATestisonepossibleassignmentofbuttonsÆcombinations:
RecursivelybuildallpossiblebuttonÆcombinationassignments(includinginvalidones).
CheckifabuttonÆcombinationassignmentisvalid:
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;
}
pf3

Partial preview of the text

Download Brute Force Solution to Push Button Lock - Lecture Notes | COMP 157 and more Study notes Algorithms and Programming in PDF only on Docsity!

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& v) { if (n==1) { for (int j=0; j<=max; j++) { Test t(1); t.x[0] = j; v.push_back(t); } return; } vector 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;

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 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);