算法思想:
数独游戏的规则:
每一行都用到1、2、3、4、5、6、7、8、9位置不限;
每一列都用到1、2、3、4、5、6、7、8、9位置不限;
每3×3的格子(共九个这样的格子)都用到1、2、3、4、5、6、7、8、9位置不限。
游戏的过程就是用1、2、3、4、5、6、7、8、9填充空白,并要求满足每行、每列、每个九宫格都用到1、2、3、4、5、6、7、8、9。
实现方法:由于数独都是9*9的,所以解空间有81层,每层有9个分支,我们做的就是遍历这个解空间。求得到所有解的话,可以在解出现的时候存下来:
1 #include "stdafx.h" 2 #include3 #include"stdlib.h" 4 #include 5 #include 6 #include 7 #include 8 using namespace std; 9 vector > >sum;10 bool check(vector > &board,int k)11 {12 int x = k / 9;13 int y = k % 9;14 for (int i = 0; i < 9; i++)15 {16 if (i != x&&board[x][y] == board[i][y])17 return false;18 }19 for (int j = 0; j < 9; j++)20 {21 if (j != y&&board[x][y] == board[x][j])22 return false;23 }24 for (int i = 3 * (x / 3); i < 3 * (x / 3 + 1); i++)25 for (int j = 3 * (y/3); j < 3 * (y / 3 + 1); j++)26 if (i != x&&j != y&&board[i][j] == board[x][y])27 return false;28 return true;29 }30 void dfs(int num, vector >& board)31 {32 if (num == 81)33 {34 sum.push_back(board);35 return;36 }37 else {38 int x = num / 9;39 int y = num % 9;40 if (board[x][y] == '.')41 {42 for (int i = 1; i < 10; i++)43 {44 board[x][y] = i + '0';45 if (check(board, num))46 {47 dfs(num + 1, board);48 }49 50 }51 board[x][y] = '.';//如果没有满足条件的数值,则恢复原来点值,向上回溯,改变父节点的值,重新往下计算,直到根节点第一个位置的值遍历到9为止。52 }53 else54 {55 dfs(num + 1, board);56 }57 }58 }59 void solveSudoku(vector >& board)60 {61 dfs(0,board);62 }63 int main()64 {65 vector myboard({ "...748...","7........",".2.1.9...","..7...24.",".64.1.59.",".98...3..","...8.3.2.","........6","...2759.." });66 vector temp(9, '.');67 vector > board(9, temp);68 for (int i = 0; i