回溯法求解数独(C++实现)
2012-04-21 00:57
351 查看
回溯法(探索与回溯法)是一种选优搜索法,按选优条件向前搜索,以达到目标。但当探索到某一步时,发现原先选择并不优或达不到目标,就退回一步重新选择,这种走不通就退回再走的技术为回溯法,而满足回溯条件的某个状态的点称为“回溯点”。
测试数据:
运行结果:
同样利用到回溯求解的有:ACM入门之杭电1045:Fire Net C++解法
#include <iostream> #include <algorithm> using namespace std; int map[9][9]; bool isPlace(int count){ int row = count / 9; int col = count % 9; int j; //同一行 for(j = 0; j < 9; ++j){ if(map[row][j] == map[row][col] && j != col){ return false; } } //同一列 for(j = 0; j < 9; ++j){ if(map[j][col] == map[row][col] && j != row){ return false; } } //同一小格 int tempRow = row / 3 * 3; int tempCol = col / 3 * 3; for(j = tempRow; j < tempRow + 3;++j){ for(int k = tempCol; k < tempCol + 3; ++k){ if(map[j][k] == map[row][col] && j != row && k != col){ return false; } } } return true; } void backtrace(int count){ if(count == 81){ cout<<"结果:"<<endl; for(int i = 0; i < 9; ++i){ for(int j = 0; j < 9; ++j){ cout<<map[i][j]<<" "; } cout<<endl; } return; } int row = count / 9; int col = count % 9; if(map[row][col] == 0){ for(int i = 1; i <= 9; ++i){ map[row][col] = i;//赋值 if(isPlace(count)){//可以放 backtrace(count+1);//进入下一层 } } map[row][col] = 0;//回溯 }else{ backtrace(count+1); } } int main() { for(int i = 0; i < 9; ++i){ for(int j = 0; j < 9; ++j){ cin>>map[i][j]; } } backtrace(0); return 0; }
测试数据:
8 0 0 0 0 0 0 0 1 9 0 0 0 2 0 0 0 3 0 3 0 0 5 0 0 7 0 0 0 5 0 0 0 4 0 0 0 0 4 5 0 9 6 0 0 0 0 0 8 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 4 6 0 0 0 8 2 0 0 2 0 3 0 5 0 9 0
运行结果:
同样利用到回溯求解的有:ACM入门之杭电1045:Fire Net C++解法
相关文章推荐
- 回溯法求解数独(C++实现)
- 求解数独的C++实现
- PHP实现的数独求解问题示例
- C++ 实现已知直线上两个点求解直线方程,并求两条直线的交点
- 动态规划 数塔问题求解 C++实现
- 最大子数组问题-暴力求解-c++代码实现及运行实例结果
- Guass列主元、平方根法、追赶法求解方程组的C++实现
- 回溯法求解数独问题的思路和代码
- 回溯法求解N皇后问题(Java实现)
- 最大子数组问题-暴力求解-c++代码实现及运行实例结果
- java使用回溯法求解数独示例
- 哈密顿环求解 C++实现 回溯法
- 解数独算法--C++实现
- 数独解法 C++实现
- 经典算法<一>迷宫问题 1.单条路径 DFS求解 C++实现
- 最大子数组问题-暴力求解-c++代码实现及运行实例结果
- 平方根法求解线性方程组(C++实现)
- C++实现求解逆矩阵
- 0/1背包问题 - 回溯法(C++实现)
- 用c++代码实现贪心算法求解最短路径问题