1 #include
2 #include
3 #include
4 #include
5 using namespacestd;6
7 const int MaxLen = 9;8 //以下三个数组用于判断是否有重复,避免循环查找重复元素
9 char ArrRow[MaxLen][MaxLen] = {0}; //用于快速判断行内有没有重复元素
10 char ArrCol[MaxLen][MaxLen] = {0}; //用于快速判断列内有没有重复元素
11 char ArrGlb[MaxLen][MaxLen] = {0}; //用于快速判断每9个格子里有没有重复元素
12
13 void SetMark(int nX,int nY, int nIdx, int nCheck, intnSet)14 {15 ArrRow[nX][nCheck] =nSet;16 ArrCol[nY][nCheck] =nSet;17 ArrGlb[nIdx][nCheck] =nSet;18 }19
20 bool TrySet(vector>& board, int nNextX, int nNextY)//xy为考察到哪个坐标了
21 {22 while (board[nNextX][nNextY] != '.')//考察下个坐标
23 {24 if (nNextY < MaxLen-1)25 {26 ++nNextY;27 }28 else if (nNextX < MaxLen-1)29 {30 ++nNextX;31 nNextY=0;32 }33 else
34 {35 return true;36 }37 }38 bool bHave = false;39 int nIndex = (nNextX / 3) * 3 + nNextY / 3;40 for (int szDian = 0; szDian < 9; ++szDian)41 {42 if(ArrRow[nNextX][szDian] == 1 || ArrCol[nNextY][szDian] == 1 || ArrGlb[nIndex][szDian] == 1)43 continue;44
45 bHave = true;46 board[nNextX][nNextY] = '1' +szDian;47
48 SetMark(nNextX, nNextY, nIndex, szDian, 1);49 if(!TrySet(board, nNextX, nNextY))50 {51 board[nNextX][nNextY] = '.';52 bHave = false;53 SetMark(nNextX, nNextY, nIndex, szDian, 0);54 }55 }56 if (!bHave)57 {58 return false;59 }60 return true;61 }62 void solveSudoku(vector>&board)63 {64 //把vector元素映射到检查辅助数组
65 int nTemp = 0;66 int nIndex = 0;67 int nIndexX = 0;68 for (int i = 0; i
82 TrySet(board, 0, 0);83 }84 //------------------------------85 //----------以下是测试代码-------86 //------------------------------
87 void Print(vector>&board)88 {89 for (int i = MaxLen-1; i>=0 ;--i)90 {91 for (int j = 0; j>board;103 char arrp1[9] = {'.','.','.','2','7','5','9','.','.'};104 char arrp2[9] = {'.','.','.','.','.','.','.','.','6'};105 char arrp3[9] = {'.','.','.','8','.','3','.','2','.'};106 char arrp4[9] = {'.','9','8','.','.','.','3','.','.'};107 char arrp5[9] = {'.','6','4','.','1','.','5','9','.'};108 char arrp6[9] = {'.','.','7','.','.','.','2','4','.'};109 char arrp7[9] = {'.','2','.','1','.','9','.','.','.'};110 char arrp8[9] = {'7','.','.','.','.','.','.','.','.'};111 char arrp9[9] = {'.','.','9','7','4','8','.','.','.'};112 /*char arrp1[9] = {'5','3','.','.','7','.','.','.','.'};113 char arrp2[9] = {'6','.','.','1','9','5','.','.','.'};114 char arrp3[9] = {'.','9','8','.','.','.','.','6','.'};115 char arrp4[9] = {'8','.','.','.','6','.','.','.','3'};116 char arrp5[9] = {'4','.','.','8','.','3','.','.','1'};117 char arrp6[9] = {'7','.','.','.','2','.','.','.','6'};118 char arrp7[9] = {'.','6','.','.','.','.','2','8','.'};119 char arrp8[9] = {'.','.','.','4','1','9','.','.','5'};120 char arrp9[9] = {'.','.','.','.','8','.','.','7','9'};*/
121 vector vectemp9(arrp9, arrp9 + 9);122 vector vectemp8(arrp8, arrp8 + 9);123 vector vectemp7(arrp7, arrp7 + 9);124 vector vectemp6(arrp6, arrp6 + 9);125 vector vectemp5(arrp5, arrp5 + 9);126 vector vectemp4(arrp4, arrp4 + 9);127 vector vectemp3(arrp3, arrp3 + 9);128 vector vectemp2(arrp2, arrp2 + 9);129 vector vectemp1(arrp1, arrp1 + 9);130 board.push_back(vectemp9);131 board.push_back(vectemp8);132 board.push_back(vectemp7);133 board.push_back(vectemp6);134 board.push_back(vectemp5);135 board.push_back(vectemp4);136 board.push_back(vectemp3);137 board.push_back(vectemp2);138 board.push_back(vectemp1);139 Print(board);140 solveSudoku(board);141 Print(board);142 return 0;143 }