
рд╕реБрдбреЛрдХреВ рдПрдХ рд▓реЛрдХрдкреНрд░рд┐рдп рдкрд╣реЗрд▓реА рдЦреЗрд▓ рд╣реИ рдЬрд┐рд╕рдХрд╛ рдореБрдЦреНрдп рдХрд╛рд░реНрдп рд╕рдВрдЦреНрдпрд╛рдУрдВ рдХреЛ рд╕рд╣реА рдХреНрд░рдо рдореЗрдВ рд░рдЦрдирд╛ рд╣реИред
рдЦреЗрд▓ рдХрд╛ рдореИрджрд╛рди 9x9 рдХреЛрд╢рд┐рдХрд╛рдУрдВ рдХрд╛ рдПрдХ рд╡рд░реНрдЧ рд╣реИред рдХреЛрд╢рд┐рдХрд╛рдУрдВ рдХреЛ рдиреМ 3x3 рдЦрдВрдбреЛрдВ рдореЗрдВ рдмрд╛рдВрдЯрд╛ рдЧрдпрд╛ рд╣реИред рдкреНрд░рддреНрдпреЗрдХ рд╕реЗрд▓ рдореЗрдВ, рдПрдХ рд╕реЗ рдиреМ рддрдХ рдХреА рд╕рдВрдЦреНрдпрд╛ рджрд░реНрдЬ рдХреА рдЬрд╛ рд╕рдХрддреА рд╣реИред рд╕реБрдбреЛрдХреВ рдХрд╛ рдореВрд▓ рдирд┐рдпрдо рдпрд╣ рд╣реИ рдХрд┐ рдХрд┐рд╕реА рд╕рдВрдЦреНрдпрд╛ рдХреЛ рдкрдВрдХреНрддрд┐, рд╕реНрддрдВрдн рдФрд░ рдЦрдВрдб рдореЗрдВ рджреЛрд╣рд░рд╛рдпрд╛ рдирд╣реАрдВ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред
рдХреИрдЯ рдХреЗ рддрд╣рдд рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдореЗрдВ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рд┐рдд рдПрдХ рд╕реБрдбреЛрдХреВ рд╕рдорд╛рдзрд╛рди рдПрд▓реНрдЧреЛрд░рд┐рджрдо рд╣реИред рдкрд╣реЗрд▓реА рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреЗрд╡рд▓ рдмреБрдирд┐рдпрд╛рджреА рд░рдгрдиреАрддрд┐ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рдмрдбрд╝реА рд╕рдВрдЦреНрдпрд╛ рдореЗрдВ рдкреНрд░рдХрд╛рд╢ рдФрд░ рдордзреНрдпрдо рд╕реНрддрд░ рдХреЗ рд╕реБрдбреЛрдХреВ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рд╣реИред
рдореБрдЦреНрдп рд╡рд┐рдЪрд╛рд░
рдПрдХ рдХреНрд╖реЗрддреНрд░ рдореЗрдВ рдПрдХ рдХреЛрд╢рд┐рдХрд╛ рдореЗрдВ рддреАрди рдЕрд╡рд╕реНрдерд╛рдПрдБ рд╣реЛ рд╕рдХрддреА рд╣реИрдВ:
- рд╢реБрд░реВ рдореЗрдВ рдореВрд▓реНрдп рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ
- рдЕрдЬреНрдЮрд╛рдд - рдорд╛рди рдкрд░рд┐рднрд╛рд╖рд┐рдд рдирд╣реАрдВ рд╣реИ
- рд╣рд▓ - рдореВрд▓реНрдп рдорд┐рд▓рд╛
рдкреНрд░рддреНрдпреЗрдХ рдЕрдирд╕реБрд▓рдЭреЗ рд╕реЗрд▓ рдХреЗ рд▓рд┐рдП, рдЕрдиреБрдорд╛рдирд┐рдд рдореВрд▓реНрдпреЛрдВ рдХреА рдПрдХ рд╕рд░рдгреА рдЬрд┐рд╕реЗ рд╡рд╣ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░ рд╕рдХрддрд╛ рд╣реИ (рдЙрдореНрдореАрджрд╡рд╛рд░) рд╕рдВрдЧреНрд░рд╣реАрдд рд╣реИред рд╕реБрдбреЛрдХреВ рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдпрд╣ рдЕрдирд╕реБрд▓рдЭреЗ рдХреЛрд╢рд┐рдХрд╛рдУрдВ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд╡реИрдХрд▓реНрдкрд┐рдХ рд░реВрдк рд╕реЗ рд╕реЙрд░реНрдЯ рдХрд░рдиреЗ рдФрд░ рдЙрдирдореЗрдВ рд╕реЗ рдкреНрд░рддреНрдпреЗрдХ рдореЗрдВ рдЙрдореНрдореАрджрд╡рд╛рд░реЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рдХреЛ рдХрдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рд╣реИред рдпрджрд┐ рдЙрдореНрдореАрджрд╡рд╛рд░реЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рдПрдХ рддрдХ рдХрдо рд╣реЛ рдЬрд╛рддреА рд╣реИ, рддреЛ рд╕реЗрд▓ рдорд╛рди рдкрд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рдЗрд╕реЗ
рд╣рд▓ рдХреА рдЧрдИ рд╕реНрдерд┐рддрд┐ рдХреЛ рд╕реМрдВрдкрд╛ рдЬрд╛рддрд╛
рд╣реИ ред
рдПрдХ рд╕рдорд╛рдзрд╛рди рдХреА рддрд▓рд╛рд╢ рд╕рдорд╛рдкреНрдд рд╣реЛ рдЬрд╛рддреА рд╣реИ, рдпрджрд┐ рд╕рднреА рдЕрдирд╕реБрд▓рдЭреЗ рдХреЛрд╢рд┐рдХрд╛рдУрдВ рдХреА рдЧрдгрдирд╛ рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, рдЙрдирдореЗрдВ рд╕реЗ рдХреЛрдИ рднреА рд╕рдорд╛рдзрд╛рди рдирд╣реАрдВ рдЦреЛрдЬ рд╕рдХрд╛ рдпрд╛ рдЙрдореНрдореАрджрд╡рд╛рд░реЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рдирд╣реАрдВ рдмрджрд▓реА рдЧрдИ:
function solve() { var changed = 0; do { // changed = updateSuggests(); steps++; if ( 81 < steps ) { // break; } } while (changed); }; // end of method solve() function updateSuggests() { var changed = 0; var buf = arrayDiff(solved[1][3][2], rowContent(1)); buf = arrayDiff(buf, colContent(3)); buf = arrayDiff(buf, sectContent(1, 3)); for ( var i=0; i<9; i++) { for ( var j=0; j<9; j++) { if ( 'unknown' != solved[i][j][1] ) { // , continue; } // "" changed += solveSingle(i, j); // " " changed += solveHiddenSingle(i, j); } } return changed; }; // end of method updateSuggests()
рдПрд▓реНрдЧреЛрд░рд┐рджрдо рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди
рд╕реБрдбреЛрдХреВ рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдХреЗ рдХрдИ рддрд░реАрдХреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдкреНрд░рджрд░реНрд╢рди рдЙрджреНрджреЗрд╢реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП, рджреЛ рд╕рд░рд▓ рддрд░реАрдХреЛрдВ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВ:
рд▓реЛрдиреЗрд░ рдФрд░
рд╣рд┐рдбрди рд▓реЛрдиреЗрд░ ред рд╕реБрдбреЛрдХреВ рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдпреЗ рдореВрд▓ рддрд░реАрдХреЗ рд╣реИрдВ рдФрд░ рдмреБрдирд┐рдпрд╛рджреА рд╕рд┐рджреНрдзрд╛рдВрддреЛрдВ рдХреЛ рд╕реАрдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдорд╣рд╛рди рд╣реИрдВред
"
рд▓реЛрдиреЗрд░ " рд╡рд┐рдзрд┐ рд╕реАрдзреЗ рд╕реБрдбреЛрдХреВ рдирд┐рдпрдореЛрдВ рдкрд░ рдЖрдзрд╛рд░рд┐рдд рд╣реИ: рдХрд┐рд╕реА рднреА рд╕рдВрдЦреНрдпрд╛ рдХреЛ рдХреЗрд╡рд▓ рдПрдХ рдмрд╛рд░ рдкрдВрдХреНрддрд┐, рд╕реНрддрдВрдн рдФрд░ рдЦрдВрдб рдореЗрдВ рдкрд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдХреЗ рджреГрд╖реНрдЯрд┐рдХреЛрдг рд╕реЗ, рдЗрд╕рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рд╕реЗрд▓ рдХреЗ рдЙрдореНрдореАрджрд╡рд╛рд░реЛрдВ рдХреА рд╕реВрдЪреА рд╕реЗ рдЗрд╕рдХреА рдкрдВрдХреНрддрд┐, рд╕реНрддрдВрдн рдФрд░ рдЦрдВрдб рд╕реЗ рд╕рднреА рдкрд╛рдП рдЧрдП рдирдВрдмрд░ рд╣рдЯрд╛ рджрд┐рдП рдЬрд╛рдПрдВрдЧреЗред
/** * "" */ function solveSingle(i, j) { solved[i][j][2] = arrayDiff(solved[i][j][2], rowContent(i)); solved[i][j][2] = arrayDiff(solved[i][j][2], colContent(j)); solved[i][j][2] = arrayDiff(solved[i][j][2], sectContent(i, j)); if ( 1 == solved[i][j][2].length ) { // markSolved(i, j, solved[i][j][2][0]); return 1; } return 0; }; // end of method solveSingle()
"
рд╣рд┐рдбрди рд▓реЛрдирд░ " рд╡рд┐рдзрд┐ рдирд┐рдпрдо рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреА рд╣реИ: рдпрджрд┐ рдПрдХ рдкрдВрдХреНрддрд┐ / рд╕реНрддрдВрдн / рдЦрдВрдб рдореЗрдВ рдЙрдореНрдореАрджрд╡рд╛рд░реЛрдВ рдХреЗ рдмреАрдЪ рдПрдХ рдПрдХрд▓ рдЕрдВрдХ рдХреЗрд╡рд▓ рдПрдХ рд╕реЗрд▓ рдореЗрдВ рд╣реЛрддрд╛ рд╣реИ, рддреЛ рдЗрд╕ рд╕реЗрд▓ рдХрд╛ рдореВрд▓реНрдп рдЗрд╕ рддрд░рд╣ рдХреЗ рдПрдХ рдЖрдВрдХрдбрд╝реЗ рдХреЗ рдмрд░рд╛рдмрд░ рд╣реЛрдЧрд╛ред
function solveHiddenSingle(i, j) { var less_suggest = lessRowSuggest(i, j); var changed = 0; if ( 1 == less_suggest.length ) { markSolved(i, j, less_suggest[0]); changed++; } var less_suggest = lessColSuggest(i, j); if ( 1 == less_suggest.length ) { markSolved(i, j, less_suggest[0]); changed++; } var less_suggest = lessSectSuggest(i, j); if ( 1 == less_suggest.length ) { markSolved(i, j, less_suggest[0]); changed++; } return changed; }; // end of method solveHiddenSingle() function lessRowSuggest(i, j) { var less_suggest = solved[i][j][2]; for ( var k=0; k<9; k++ ) { if ( k == j || 'unknown' != solved[i][k][1] ) { continue; } less_suggest = arrayDiff(less_suggest, solved[i][k][2]); } return less_suggest; }; // end of method lessRowSuggest() function lessColSuggest(i, j) { var less_suggest = solved[i][j][2]; for ( var k=0; k<9; k++ ) { if ( k == i || 'unknown' != solved[k][j][1] ) { continue; } less_suggest = arrayDiff(less_suggest, solved[k][j][2]); } return less_suggest; }; // end of method lessColSuggest() function lessSectSuggest(i, j) { var less_suggest = solved[i][j][2]; var offset = sectOffset(i, j); for ( var k=0; k<3; k++ ) { for ( var l=0; l<3; l++ ) { if ( ((offset.i+k) == i && (offset.j+l) == j)|| 'unknown' != solved[offset.i+k][offset.j+l][1] ) { continue; } less_suggest = arrayDiff(less_suggest, solved[offset.i+k][offset.j+l][2]); } } return less_suggest; }; // end of method lessSectSuggest()
рдХреЗ рдЙрдкрдпреЛрдЧ
рд╕рднреА рдХреЛрдб
рд╕реБрдбреЛрдХреВ рд╡рд░реНрдЧ рдХреЗ рд░реВрдк рдореЗрдВ рдбрд┐рдЬрд╝рд╛рдЗрди рдХрд┐рдП рдЧрдП рд╣реИрдВред рдкрд╣реЗрд▓реА рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдХрдХреНрд╖рд╛ рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг рдмрдирд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдЗрд╕рдореЗрдВ рдХрд╛рд░реНрдп рдХреА рд╕реНрдерд┐рддрд┐ рдХреЛ рдкрд╛рд╕ рдХрд░реЗрдВ рдФрд░
рд╣рд▓ () рд╡рд┐рдзрд┐
рдХреЛ рдХреЙрд▓ рдХрд░реЗрдВред рд╕рдорд╛рдзрд╛рди рдХрд╛ рдкрд░рд┐рдгрд╛рдо
HTML () рд╡рд┐рдзрд┐ рджреНрд╡рд╛рд░рд╛ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬреЛ рдПрдХ рд╕реНрд╡рд░реВрдкрд┐рдд рддрд╛рд▓рд┐рдХрд╛ рдФрд░ рд╕рдорд╛рдзрд╛рди рдЦреЛрдЬрдиреЗ рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рдкрд╛рд╕ рдХреА рд╕рдВрдЦреНрдпрд╛ рджреЗрддрд╛ рд╣реИред рдпрджрд┐ рд╕рдорд╛рдзрд╛рди рдирд╣реАрдВ рдорд┐рд▓ рд╕рдХрддрд╛ рд╣реИ, рддреЛ рдкрд░рд┐рдгрд╛рдореЛрдВ рдХреА рдПрдХ рддрд╛рд▓рд┐рдХрд╛ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХреА рдЬрд╛рдПрдЧреА рдФрд░, рдЦрд╛рд▓реА рдХреЛрд╢рд┐рдХрд╛рдУрдВ рдкрд░ рдордБрдбрд░рд╛ рдХрд░рдХреЗ, рдЙрдореНрдореАрджрд╡рд╛рд░реЛрдВ рдХреА рдПрдХ рд╕реВрдЪреА рдкреНрд░рджрд░реНрд╢рд┐рдд рдХреА рдЬрд╛рдПрдЧреАред
рдкреНрд░рд╛рд░рдВрднрд┐рдХ рдорд╛рди 9x9 рдкреВрд░реНрдгрд╛рдВрдХ рдореИрдЯреНрд░рд┐рдХреНрд╕ рджреНрд╡рд╛рд░рд╛ рджрд┐рдП рдЧрдП рд╣реИрдВред рдпрджрд┐ рдореВрд▓реНрдп рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдирд╣реАрдВ рд╣реИ рдФрд░ рд╕рдВрдЦреНрдпрд╛ рдЕрд▓рдЧ рд╣реИ, рддреЛ рдХреЛрд╢рд┐рдХрд╛рдУрдВ рдореЗрдВ "0" рд▓рд┐рдЦрд╛ рдЬрд╛рддрд╛ рд╣реИред
var in_val = [ [0, 0, 3, 0, 0, 8, 2, 0, 4], [0, 2, 0, 0, 6, 4, 0, 1, 0], [9, 0, 0, 0, 0, 0, 0, 0, 8], [0, 8, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 6, 9, 8, 0], [0, 0, 0, 0, 0, 0, 5, 0, 0], [0, 0, 4, 9, 0, 7, 0, 3, 0], [8, 0, 0, 0, 0, 1, 0, 0, 0], [0, 7, 0, 0, 5, 0, 4, 0, 0] ]; var sudoku = new Sudoku(in_val); document.write(sudoku.html());
рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдХрд╛ рдкрд░рд┐рдгрд╛рдо рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрддрд╛ рд╣реИ:

рд╕реБрдбреЛрдХреВ рд╡рд░реНрдЧ рдХреЗ рд▓рд┐рдП рд╕реНрд░реЛрдд рдХреЛрдб, рд╕рд╛рде рд╣реА рдХрдИ рдирдореВрдирд╛ рдХрд╛рд░реНрдп,
рдЗрд╕ рд▓рд┐рдВрдХ рдкрд░ рдЙрдкрд▓рдмреНрдз рд╣реИрдВред
рд╕рдВрджрд░реНрдн
рд╕реБрдбреЛрдХреВ [рд╡рд┐рдХрд┐рдкреАрдбрд┐рдпрд╛]рд╕реБрдбреЛрдХреВ рдХреЛ рдХреИрд╕реЗ рд╣рд▓ рдХрд░реЗрдВ: рддрд░реАрдХреЗ, рддрд░реАрдХреЗ рдФрд░ рд░рдгрдиреАрддрд┐UPD рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛
rozboris рдХреГрдкрдпрд╛ рдПрдХ
рдбреЗрдореЛ рдмрдирд╛рдпрд╛
рдпреВрдкреАрдбреА 2 рд░рд┐рд╡рд░реНрд╕ рдЦреЛрдЬ
рд▓рд╛рдЧреВ ред рдЕрдм рд╕рднреА рд╕реБрдбреЛрдХреВ рд╣рд▓ред рдФрд░
рд░реЛрдЬрдмреЛрд░рд┐рд╕ рд╕реЗ рдПрдХ
рдирдпрд╛ рдбреЗрдореЛ ред
UPD3 рдЪреВрдВрдХрд┐ рд▓реЗрдЦ рдХреЗ рд▓рд┐рдВрдХ рдорд░ рдЧрдП рд╣реИрдВ, рдореИрдВрдиреЗ
Google рдХреЛрдб рдкрд░ рд╕реНрд░реЛрдд рдХреЛрдб рдкреЛрд╕реНрдЯ рдХрд┐рдпрд╛ рд╣реИред