//Stephen Siena //CSE 40872 - Problem 4 //September 4, 2009 #include #include #include #include #include using namespace std; void find_digits(vector &entries, vector &digits); void make_sets(vector &entries, vector &digits, vector > &sets); void crack_code(vector &digits, vector > &sets); int main(){ int passcode; vector entries; vector digits; vector > sets; while(true){ cin >> passcode; //entries.push_back(passcode); if (cin.eof()) break; entries.push_back(passcode); } find_digits(entries, digits); make_sets(entries, digits, sets); crack_code(digits, sets); cout << endl; return 0; } void find_digits(vector &entries, vector &digits){ int values[10] = {0}; vector::iterator i; for (i = entries.begin(); i != entries.end(); ++i){ values[(*i)%10]++; values[((*i)%100)/10]++; values[(*i)/100]++; } for (int j = 0; j < 10; j++){ if (values[j] != 0){ digits.push_back(j); } } } void make_sets(vector &entries, vector &digits, vector > &sets){ sets.resize(10); for (int i = 0; i < 10; i++){ sets[i].resize(10); } vector::iterator it; for (int i = 0; i < (int)digits.size(); i++){ for (it = entries.begin(); it != entries.end(); ++it){ if ( (*it)%10 == digits[i]){ sets[digits[i]][((*it)%100)/10]++; sets[digits[i]][(*it)/100]++; } else if ( ((*it)%100)/10 == digits[i]){ sets[digits[i]][(*it)/100]++; } } } /* for (int i = 0; i < 10; i++){ for (int j = 0; j < 10; j++){ cout << sets[i][j] << " "; } cout << endl; } */ } void crack_code(vector &digits, vector > &sets){ int rowSum = 0; int i, j, k; int digitsUsed[10] = {0}; vector::iterator it; for (i = 0; i < (int)digits.size(); i++){ for (it = digits.begin(); it != digits.end(); ++it){ for (j = 0; j < 10; j++){ rowSum += sets[*it][j]; } if (rowSum == 0){ if (digitsUsed[*it] == 0){ digitsUsed[*it]++; cout << *it; } for (k = 0; k < 10; k++){ sets[*it][k] = 1; sets[k][*it] = 0; } } rowSum = 0; } } }