Advertisement
dannye33

sudoku.cpp

Dec 13th, 2014
983
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. #include <iostream>
  2. #include <Windows.h>
  3. #include <conio.h>
  4.  
  5. using namespace std;
  6.  
  7. char sudoku[9][9];
  8.  
  9. void printSudoku(bool);
  10. void recursiveScan();
  11. void method1(bool &);
  12. void method2(bool &);
  13. bool checkBox(int, int, char);
  14.  
  15. int main()
  16. {
  17.     // initialize sudoku[][]
  18.     for (int i = 0; i < 9; i++)
  19.     {
  20.         for (int j = 0; j < 9; j++)
  21.         {
  22.             sudoku[i][j] = ' ';
  23.         }
  24.     }
  25.     // print empty grid
  26.     printSudoku(false);
  27.     // input sudoku
  28.     printSudoku(true);
  29.     system("pause");
  30.     system("CLS");
  31.     // solve sudoku
  32.     recursiveScan();
  33.     system("pause");
  34.     return 0;
  35. }
  36.  
  37. void printSudoku(bool input)
  38. {
  39.     // reset cursor position
  40.     COORD cursor = { 0, 0 };
  41.     SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), cursor);
  42.     char key;
  43.     for (int i = 0; i < 9; i++)
  44.     {
  45.         for (int j = 0; j < 9; j++)
  46.         {
  47.             switch (j)
  48.             {
  49.             case 0:
  50.             {
  51.                 // print grid rows
  52.                 switch (i)
  53.                 {
  54.                 case 1:
  55.                 case 2:
  56.                 case 4:
  57.                 case 5:
  58.                 case 7:
  59.                 case 8:
  60.                 {
  61.                     cout << char(196)
  62.                         << char(197)
  63.                         << char(196)
  64.                         << char(197)
  65.                         << char(196)
  66.                         << char(186)
  67.                         << char(196)
  68.                         << char(197)
  69.                         << char(196)
  70.                         << char(197)
  71.                         << char(196)
  72.                         << char(186)
  73.                         << char(196)
  74.                         << char(197)
  75.                         << char(196)
  76.                         << char(197)
  77.                         << char(196)
  78.                         << '\n';
  79.                     break;
  80.                 }
  81.                 case 3:
  82.                 case 6:
  83.                 {
  84.                     cout << char(205)
  85.                         << char(205)
  86.                         << char(205)
  87.                         << char(205)
  88.                         << char(205)
  89.                         << char(206)
  90.                         << char(205)
  91.                         << char(205)
  92.                         << char(205)
  93.                         << char(205)
  94.                         << char(205)
  95.                         << char(206)
  96.                         << char(205)
  97.                         << char(205)
  98.                         << char(205)
  99.                         << char(205)
  100.                         << char(205)
  101.                         << '\n';
  102.                     break;
  103.                 }
  104.                 default:
  105.                 {
  106.                     break;
  107.                 }
  108.                 }
  109.                 break;
  110.             }
  111.             // print grid columns
  112.             case 1:
  113.             case 2:
  114.             case 4:
  115.             case 5:
  116.             case 7:
  117.             case 8:
  118.             {
  119.                 cout << char(179);
  120.                 break;
  121.             }
  122.             case 3:
  123.             case 6:
  124.             {
  125.                 cout << char(186);
  126.                 break;
  127.             }
  128.             default:
  129.                 break;
  130.             }
  131.             // get initial sudoku from user
  132.             if (input)
  133.             {
  134.                 do
  135.                 {
  136.                     key = _getch();
  137.                 } while (!strchr("123456789 ", key));
  138.                 sudoku[i][j] = key;
  139.             }
  140.             cout << sudoku[i][j];
  141.         }
  142.         cout << '\n';
  143.     }
  144. }
  145.  
  146. // perform both methods while either method is still successful
  147. void recursiveScan()
  148. {
  149.     bool meth1, meth2;
  150.     do
  151.     {
  152.         printSudoku(false);
  153.         method1(meth1);
  154.         method2(meth2);
  155.         Sleep(500);
  156.     } while (meth1 || meth2);
  157. }
  158.  
  159. // test if each box can only be a specific number
  160. void method1(bool &meth1)
  161. {
  162.     meth1 = false;
  163.     bool boxes[9];
  164.     for (int i = 0; i < 9; i++)
  165.     {
  166.         for (int j = 0; j < 9; j++)
  167.         {
  168.             // if current box is already solved, abort
  169.             if (sudoku[i][j] != ' ')
  170.             {
  171.                 continue;
  172.             }
  173.             // initialize boxes[]
  174.             for (int k = 0; k < 9; k++)
  175.             {
  176.                 boxes[k] = true;
  177.             }
  178.             // keep track of which numbers this box cannot be
  179.             for (int ii = 0; ii < 9; ii++)
  180.             {
  181.                 if (sudoku[ii][j] != ' ')
  182.                 {
  183.                     boxes[(sudoku[ii][j] - '0') - 1] = false;
  184.                 }
  185.             }
  186.             for (int jj = 0; jj < 9; jj++)
  187.             {
  188.                 if (sudoku[i][jj] != ' ')
  189.                 {
  190.                     boxes[(sudoku[i][jj] - '0') - 1] = false;
  191.                 }
  192.             }
  193.             for (int ii = i - (i % 3); ii < i - (i % 3) + 3; ii++)
  194.             {
  195.                 for (int jj = j - (j % 3); jj < j - (j % 3) + 3; jj++)
  196.                 {
  197.                     if (sudoku[ii][jj] != ' ')
  198.                     {
  199.                         boxes[(sudoku[ii][jj] - '0') - 1] = false;
  200.                     }
  201.                 }
  202.             }
  203.             // count how many numbers this box can be
  204.             int options = 0;
  205.             char answer;
  206.             for (int k = 0; k < 9; k++)
  207.             {
  208.                 if (boxes[k] == true)
  209.                 {
  210.                     options++;
  211.                     if (options > 1)
  212.                     {
  213.                         break;
  214.                     }
  215.                     answer = k + 1 + '0';
  216.                 }
  217.             }
  218.             // if this box can only be one number, success
  219.             if (options == 1)
  220.             {
  221.                 sudoku[i][j] = answer;
  222.                 meth1 = true;
  223.             }
  224.         }
  225.     }
  226. }
  227.  
  228. // test if each row/column/3x3 box has only one space left for a specific number
  229. void method2(bool &meth2)
  230. {
  231.     meth2 = false;
  232.     int options;
  233.     int answeri, answerj;
  234.     for (char n = '1'; n <= '9'; n++)
  235.     {
  236.         for (int i = 0; i < 9; i++)
  237.         {
  238.             // keep track of how many boxes in this row can be n
  239.             options = 0;
  240.             for (int j = 0; j < 9; j++)
  241.             {
  242.                 if (checkBox(i, j, n))
  243.                 {
  244.                     options++;
  245.                     if (options > 1)
  246.                     {
  247.                         break;
  248.                     }
  249.                     answerj = j;
  250.                 }
  251.             }
  252.             // if only one box in this row can be n, success
  253.             if (options == 1)
  254.             {
  255.                 sudoku[i][answerj] = n;
  256.                 meth2 = true;
  257.             }
  258.         }
  259.         for (int j = 0; j < 9; j++)
  260.         {
  261.             // keep track of how many boxes in this column can be n
  262.             options = 0;
  263.             for (int i = 0; i < 9; i++)
  264.             {
  265.                 if (checkBox(i, j, n))
  266.                 {
  267.                     options++;
  268.                     if (options > 1)
  269.                     {
  270.                         break;
  271.                     }
  272.                     answeri = i;
  273.                 }
  274.             }
  275.             // if only one box in this column can be n, success
  276.             if (options == 1)
  277.             {
  278.                 sudoku[answeri][j] = n;
  279.                 meth2 = true;
  280.             }
  281.         }
  282.         for (int i = 0; i <= 6; i += 3)
  283.         {
  284.             for (int j = 0; j <= 6; j += 3)
  285.             {
  286.                 // keep track of how many boxes in this 3x3 box can be n
  287.                 options = 0;
  288.                 for (int ii = i; ii < i + 3; ii++)
  289.                 {
  290.                     for (int jj = j; jj < j + 3; jj++)
  291.                     {
  292.                         if (checkBox(ii, jj, n))
  293.                         {
  294.                             options++;
  295.                             if (options > 1)
  296.                             {
  297.                                 break;
  298.                             }
  299.                             answeri = ii;
  300.                             answerj = jj;
  301.                         }
  302.                     }
  303.                 }
  304.                 // if only one box in this 3x3 box can be n, success
  305.                 if (options == 1)
  306.                 {
  307.                     sudoku[answeri][answerj] = n;
  308.                     meth2 = true;
  309.                 }
  310.             }
  311.         }
  312.     }
  313. }
  314.  
  315. // test if sudoku[i][j] may be n
  316. bool checkBox(int i, int j, char n)
  317. {
  318.     if (sudoku[i][j] != ' ')
  319.         return false;
  320.     // search this column for n
  321.     for (int ii = 0; ii < 9; ii++)
  322.     {
  323.         if (sudoku[ii][j] == n)
  324.         {
  325.             return false;
  326.         }
  327.     }
  328.     // search this row for n
  329.     for (int jj = 0; jj < 9; jj++)
  330.     {
  331.         if (sudoku[i][jj] == n)
  332.         {
  333.             return false;
  334.         }
  335.     }
  336.     // search this 3x3 box for n
  337.     for (int ii = i - (i % 3); ii < i - (i % 3) + 3; ii++)
  338.     {
  339.         for (int jj = j - (j % 3); jj < j - (j % 3) + 3; jj++)
  340.         {
  341.             if (sudoku[ii][jj] == n)
  342.             {
  343.                 return false;
  344.             }
  345.         }
  346.     }
  347.     // n was not found
  348.     return true;
  349. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement