Task: | Sudoku |
Sender: | |
Submission time: | 2015-08-15 22:27:44 +0300 |
Language: | C++ |
Status: | READY |
Result: | 100 |
group | verdict | score |
---|---|---|
#1 | ACCEPTED | 100 |
test | verdict | time | |
---|---|---|---|
#1 | ACCEPTED | 0.06 s | details |
#2 | ACCEPTED | 0.07 s | details |
#3 | ACCEPTED | 0.07 s | details |
#4 | ACCEPTED | 0.07 s | details |
#5 | ACCEPTED | 0.07 s | details |
Compiler report
input/code.cpp: In function 'int main()': input/code.cpp:162:9: warning: unused variable 'ans' [-Wunused-variable] int ans = 0; ^
Code
#include <iostream> #include <vector> #include <string> #include <set> #include <utility> /* Copy paste ratkaisu project euler problem 96:sta :Dd */ using namespace std; typedef vector<vector<int> > Grid; Grid readGrid(){ string s; getline(cin,s); Grid G(9,vector<int>(9)); for(int c = 0; c < 9; c++){ G[0][c] = s[c] - '0'; } return G; } vector<vector<set<int> > > getCandidates(Grid G){ vector<vector<set<int> > > candidates; for(int r = 0; r < 9; r++){ vector<set<int> > V; candidates.push_back(V); for(int c = 0; c < 9; c++){ set<int> all = {1,2,3,4,5,6,7,8,9}; candidates[r].push_back(all); } } // Row constraints for(int r = 0; r < 9; r++){ set<int> used; for(int c = 0; c < 9; c++){ used.insert(G[r][c]); } for(int c = 0; c < 9; c++){ for(auto x : used) candidates[r][c].erase(x); } } // column constraints for(int c = 0; c < 9; c++){ set<int> used; for(int r = 0; r < 9; r++){ used.insert(G[r][c]); } for(int r = 0; r < 9; r++){ for(auto x : used) candidates[r][c].erase(x); } } // square constraints for(int topleft_row = 0; topleft_row < 9; topleft_row += 3){ for(int topleft_col = 0; topleft_col < 9; topleft_col += 3){ set<int> used; for(int r = topleft_row; r < topleft_row + 3; r++){ for(int c = topleft_col; c < topleft_col + 3; c++){ used.insert(G[r][c]); } } for(int r = topleft_row; r < topleft_row + 3; r++){ for(int c = topleft_col; c < topleft_col + 3; c++){ for(auto x : used) candidates[r][c].erase(x); } } } } return candidates; } Grid propagate(Grid G){ bool update = true; while(update){ update = false; auto cand = getCandidates(G); for(int r = 0; r < 9; r++){ for(int c = 0; c < 9; c++){ if(cand[r][c].size() == 1 && G[r][c] == 0){ G[r][c] = *(cand[r][c].begin()); cand = getCandidates(G); update = true; } } } } return G; } bool done(Grid G){ for(int r = 0; r < 9; r++){ for(int c = 0; c < 9; c++){ if(G[r][c] == 0) return false; } } return true; } bool consistent(Grid G){ auto cand = getCandidates(G); for(int r = 0; r < 9; r++){ for(int c = 0; c < 9; c++){ if((cand[r][c].size() == 0 && G[r][c] == 0)){ return false; } } } return true; } // Try all guesses, and if any gives a solution, return it // If all guesses lead to inconsistencies, return an inconsistent grid // Return: branch good?, grid pair<bool,Grid> guess(Grid G, int depth){ auto cand = getCandidates(G); for(int r = 0; r < 9; r++){ for(int c = 0; c < 9; c++){ if(G[r][c] == 0){ for(int x : cand[r][c]){ auto G2 = G; G2[r][c] = x; // Make the guess G2 = propagate(G2); // Fill the rest, does not make immediately inconsistent choices // G2 will always be consistent if(done(G2)) return {true,G2}; auto asd = guess(G2,depth+1); // Was not done yet if(asd.first == true) return asd; } return {false, G}; } } } return {true, G}; // Was already done } int solve(Grid G){ G = propagate(G); G = guess(G,0).second; for(int r = 0; r < 9; r++){ for(int c = 0; c < 9; c++){ cout << G[r][c]; } cout << endl; } return G[0][0]*100 + G[0][1]*10 + G[0][2]; } int main(){ int ans = 0; Grid G = readGrid(); solve(G); }
Test details
Test 1
Verdict: ACCEPTED
input |
---|
592836471 |
correct output |
---|
592836471 836471592 471592836 928364715 364715928 ... |
user output |
---|
592836471 134257689 678149235 213465798 456798123 ... |
Test 2
Verdict: ACCEPTED
input |
---|
672935418 |
correct output |
---|
672935418 935418672 418672935 729354186 354186729 ... |
user output |
---|
672935418 134268579 589147236 213456897 456789123 ... |
Test 3
Verdict: ACCEPTED
input |
---|
329174658 |
correct output |
---|
329174658 174658329 658329174 291746583 746583291 ... |
user output |
---|
329174658 145268379 678359124 213485796 456791283 ... |
Test 4
Verdict: ACCEPTED
input |
---|
376958421 |
correct output |
---|
376958421 958421376 421376958 769584213 584213769 ... |
user output |
---|
376958421 124367589 589124367 213475698 457689132 ... |
Test 5
Verdict: ACCEPTED
input |
---|
875694321 |
correct output |
---|
875694321 694321875 321875694 756943218 943218756 ... |
user output |
---|
875694321 123578469 469123578 214356897 356789142 ... |