算法思想:

数独游戏的规则:

每一行都用到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。
实现方法:

对回溯算法的理解(以数独游戏为例,使用c++实现)-LMLPHP对回溯算法的理解(以数独游戏为例,使用c++实现)-LMLPHP对回溯算法的理解(以数独游戏为例,使用c++实现)-LMLPHP

由于数独都是9*9的,所以解空间有81层,每层有9个分支,我们做的就是遍历这个解空间。求得到所有解的话,可以在解出现的时候存下来:

 #include "stdafx.h"
#include<stdio.h>
#include"stdlib.h"
#include<iostream>
#include<ctype.h>
#include<vector>
#include<algorithm>
using namespace std;
vector<vector<vector<char> > >sum;
bool check(vector<vector<char> > &board,int k)
{
int x = k / ;
int y = k % ;
for (int i = ; i < ; i++)
{
if (i != x&&board[x][y] == board[i][y])
return false;
}
for (int j = ; j < ; j++)
{
if (j != y&&board[x][y] == board[x][j])
return false;
}
for (int i = * (x / ); i < * (x / + ); i++)
for (int j = * (y/); j < * (y / + ); j++)
if (i != x&&j != y&&board[i][j] == board[x][y])
return false;
return true;
}
void dfs(int num, vector<vector<char> >& board)
{
if (num == )
{
sum.push_back(board);
return;
}
else {
int x = num / ;
int y = num % ;
if (board[x][y] == '.')
{
for (int i = ; i < ; i++)
{
board[x][y] = i + '';
if (check(board, num))
{
dfs(num + , board);
} }
board[x][y] = '.';//如果没有满足条件的数值,则恢复原来点值,向上回溯,改变父节点的值,重新往下计算,直到根节点第一个位置的值遍历到9为止。
}
else
{
dfs(num + , board);
}
}
}
void solveSudoku(vector<vector<char> >& board)
{
dfs(,board);
}
int main()
{
vector<string> myboard({ "...748...","7........",".2.1.9...","..7...24.",".64.1.59.",".98...3..","...8.3.2.","........6","...2759.." });
vector<char> temp(, '.');
vector<vector<char> > board(, temp);
for (int i = ; i<myboard.size(); i++) {
for (int j = ; j<myboard[i].length(); j++) {
board[i][j] = myboard[i][j];
}
}
solveSudoku(board);
for (int k = ; k<sum.size(); k++) {
for (int i = ; i<sum[k].size(); i++) {
for (int j = ; j<sum[k][i].size(); j++) {
cout << sum[k][i][j] << " ";
}
cout << endl;
}
cout << "######" << endl;
}
cout << "sum is " << sum.size() << endl;
cout << "Hello world!" << endl;
system("pause");
return ;
}

对回溯算法的理解(以数独游戏为例,使用c++实现)-LMLPHP

对回溯算法的理解(以数独游戏为例,使用c++实现)-LMLPHP

05-21 07:46