博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
对回溯算法的理解(以数独游戏为例,使用c++实现)
阅读量:5061 次
发布时间:2019-06-12

本文共 1738 字,大约阅读时间需要 5 分钟。

算法思想:

数独游戏的规则:

每一行都用到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 #include
3 #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

 

转载于:https://www.cnblogs.com/mydomain/p/11215983.html

你可能感兴趣的文章
linux基础-命令
查看>>
java对象的深浅克隆
查看>>
Hadoop流程---从tpch到hive
查看>>
数据结构3——浅谈zkw线段树
查看>>
Introduction to my galaxy engine 2: Depth of field
查看>>
V2019 Super DSP3 Odometer Correction Vehicle List
查看>>
Python 3.X 练习集100题 05
查看>>
今时不同往日:VS2010十大绝技让VS6叹服
查看>>
设计器 和后台代码的转换 快捷键
查看>>
在线视频播放软件
查看>>
用代码生成器生成的DAL数据访问操作类 基本满足需求了
查看>>
28初识线程
查看>>
Monkey测试结果分析
查看>>
Sublime Text 3 设置
查看>>
浅谈C++底层机制
查看>>
STL——配接器、常用算法使用
查看>>
第9课 uart
查看>>
Range和xrange的区别
查看>>
BZOJ 1010 [HNOI2008]玩具装箱 (斜率优化DP)
查看>>
java-动态规划算法学习笔记
查看>>