回溯算法(解任意阶数独)

<p>回溯算法的基本框架为</p><p>     函数名(int cnt){   </p><p>     for()</p><p>        {</p><p>           赋值;</p><p>       if(==){</p><p>              }else{</p><p>                   函数名(cnt+1);</p><p>              }</p><p>           抹去; </p><p>        }</p><p>}</p>/*
 theme:求解数独
       回溯算法
  Coder:瞿鹏志
  time:2015.1.11
 */
#include <iostream>
using namespace std;
#define N 9
#include <math.h>
class suduk{
	private:
		int sudu[N][N];
		public:
			suduk();
			void SetSudk();//输入数独矩阵
		   bool Isvaild(int i,int j);
			void answer(int cnt);
			void Cout();
};
int main(void){
	suduk qus1;
	qus1.SetSudk();
    qus1.Cout();
    qus1.answer(0);
	return 0;
}
void suduk::Cout()
{
	for(int prin=0;prin<N*N;prin++){
	if(prin%N == 0) {
	 cout<<endl;
	}
	cout<<sudu[prin/N][prin%N]<<" ";
	}
	cout<<endl;
}
suduk::suduk(){
	for(int i=0;i<N*N;i++){
		sudu[i/N][i%N]=0;
	}
}
void suduk::SetSudk()
{
	int sudo[N][N]={{8,0,0,1,3,7,0,0,0},{6,0,0,9,0,0,0,1,0},{5,0,0,0,0,0,0,3,0},
	{0,0,0,3,8,0,0,0,9},{0,5,0,0,0,0,0,0,0},{9,0,0,0,0,0,8,7,0},{0,2,0,0,0,0,0,0,0},
	{0,0,0,0,0,6,2,4,3},{1,0,0,0,5,0,9,0,0}};
    for(int i=0;i<N;i++){
    	for(int j=0;j<N;j++){
    		sudu[i][j]=sudo[i][j];
    	//cin>>sudu[i][j];
		}
    }
}
bool suduk::Isvaild(int i,int j)
{
	int run;
    for(run=0;run<N;run++){
    	if((run!=j)&&sudu[i][run]==sudu[i][j]){
    		return false;
    	}
    	if((run!=i)&&sudu[run][j]==sudu[i][j]){
    		return false;
    	}
    }
    int jie=(int)pow((double)N,1.0/2.0);
    int row=i/jie*jie,col=j/jie*jie;
     for(run=0;run<N;run++){
     	if(row+run/jie!=i || col+run%jie != j){
     		if(sudu[row+run/jie][col+run%jie]==sudu[i][j]){
     			return false;
     		}
     	}
     }
	return true;
}
void suduk::answer(int cnt)
{
	int i=cnt/N;
	int j=cnt%N;
	if(sudu[i][j]==0){
		for(int num=1;num<=N;num++){
			sudu[i][j]=num;
			if(Isvaild(i,j)){
				if(cnt!=N*N-1){
					answer(cnt+1);
				}else{
					Cout();
				}
			}
           			sudu[i][j]=0;
		}
	}else{
		answer(cnt+1);
	}
}

回溯算法的基本框架为

函数名(int cnt){

for()

{

if(){

}else{

函数名(cnt+1);

}

}

}

时间: 2024-11-05 13:32:10

回溯算法(解任意阶数独)的相关文章

回溯算法解八皇后问题(java版)

八皇后问题是学习回溯算法时不得不提的一个问题,用回溯算法解决该问题逻辑比较简单. 下面用java版的回溯算法来解决八皇后问题. 八皇后问题,是一个古老而著名的问题,是回溯算法的典型案例.该问题是国际西洋棋棋手马克斯·贝瑟尔于1848年提出:在8×8格的国际象棋上摆放八个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行.同一列或同一斜线上,问有多少种摆法. 思路是按行来规定皇后,第一行放第一个皇后,第二行放第二个,然后通过遍历所有列,来判断下一个皇后能否放在该列.直到所有皇后都放完,或者放哪

数独游戏求解:解法适用于任意阶数的数独

0.数独简介 数独(すうどく,Sūdoku)是一种运用纸.笔进行演算的逻辑游戏.以九阶数独为例,玩家需要根据9×9盘面上的已知数字,推理出所有剩余空格的数字,并满足每一行.每一列.每一个粗线宫内的数字均含1-9,不重复. 1)4阶(可填数字范围1~4,宫格2阶) 2)9阶(可填数字范围1~9,宫格3阶) 3)16阶(可填数字范围1~16,宫格4阶) *见附录 1.数独的表示 对于N阶数独可以用一个N*N的二维数组表示 1)数独阶数GridRank=N 2)宫格阶数SubGridRank=Sqrt

经典回溯算法(八皇后问题)详解

八皇后问题,是一个古老而著名的问题,是回溯算法的典型例题.该问题是十九世纪著名的数学家高斯1850年提出: 在8X8格的国际象棋上摆放八个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行.同一列或同一斜线上 (斜率为1),问有多少种摆法.高斯认为有76种方案. 1854年在柏林的象棋杂志上不同的作者发表了40种不同的解,后来有人用图论的方法解出92种结果. 计算机发明后,有多种方法可以解决此问题. 算法思路:    首先我们分析一下问题的解,我们每取出一个皇后,放入一行,共有八种不同的放法

回溯算法详解[力扣46:全排列]

解决一个回溯问题,实际上就是一个决策树的遍历过程.你只需要思考 3 个问题: 1.路径:也就是已经做出的选择. 2.选择列表:也就是你当前可以做的选择. 3.结束条件:也就是到达决策树底层,无法再做选择的条件. 如果你不理解这三个词语的解释,没关系,我们后面会用「全排列」和「N 皇后问题」这两个经典的回溯算法问题来帮你理解这些词语是什么意思,现在你先留着印象. 代码方面,回溯算法的框架: result = [] def backtrack(路径, 选择列表): if 满足结束条件: result

回溯算法详解(转)

https://leetcode-cn.com/problems/n-queens/solution/hui-su-suan-fa-xiang-jie-by-labuladong/ 这篇文章是很久之前的一篇<回溯算法详解>的进阶版,之前那篇不够清楚,就不必看了,看这篇就行.把框架给你讲清楚,你会发现回溯算法问题都是一个套路. 废话不多说,直接上回溯算法框架.解决一个回溯问题,实际上就是一个决策树的遍历过程.你只需要思考 3 个问题: 1.路径:也就是已经做出的选择. 2.选择列表:也就是你当前

【八皇后问题】 回溯算法

回溯算法:回溯算法实际上是一个类似枚举的搜索尝试方法,它的思想是在搜索尝试中寻找问题的解,当发现不满足求解条件时,就“回溯”返回,尝试别的路径.之前介绍的基础算法中的贪婪算法,动态规划等都具有“无后效性”,也就是在分段处理问题时,某状态一旦确定,将不再改变.而多数问题很难找到"无后效性”的阶段划分和相应决策,而是通过深入搜索尝试和回溯操作完成的. 八皇后问题:8*8的国际象棋棋盘中放八个皇后,是任意两个皇后不能互相吃掉.规则:皇后能吃掉同一行,同一列,同一对角线的任意棋子. 模型建立:不妨设八个

第1次实验——NPC问题(回溯算法、聚类分析)

题目:八皇后问题,是一个古老而著名的问题,是回溯算法的典型案例.该问题是国际西洋棋棋手马克斯·贝瑟尔于1848年提出:在8X8格的国际象棋上摆放八个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行.同一列或同一斜线上,问有多少种摆法. 高斯认为有76种方案.1854年在柏林的象棋杂志上不同的作者发表了40种不同的解,后来有人用图论的方法解出92种结果.计算机发明后,有多种方法可以解决此问题.     请编程实现八皇后问题,并把92种解的前三种解输出到屏幕(8*8的二维矩阵,Q代表皇后,X代

动态规划算法解最长公共子序列LCS问题

第一部分.什么是动态规划算法 ok,咱们先来了解下什么是动态规划算法. 动态规划一般也只能应用于有最优子结构的问题.最优子结构的意思是局部最优解能决定全局最优解(对有些问题这个要求并不能完全满足,故有时需要引入一定的近似).简单地说,问题能够分解成子问题来解决. 动态规划算法分以下4个步骤: 描述最优解的结构 递归定义最优解的值 按自底向上的方式计算最优解的值   //此3步构成动态规划解的基础. 由计算出的结果构造一个最优解.   //此步如果只要求计算最优解的值时,可省略. 好,接下来,咱们

从零开始学回溯算法

本文在写作过程中参考了大量资料,不能一一列举,还请见谅. 回溯算法的定义:回溯算法也叫试探法,它是一种系统地搜索问题的解的方法.回溯算法的基本思想是:从一条路往前走,能进则进,不能进则退回来,换一条路再试. 解题的一般步骤是: 1.定义一个解空间,它包含问题的解: 2.利用适于搜索的方法组织解空间: 3.利用深度优先法搜索解空间: 4.利用限界函数避免移动到不可能产生解的子空间. 问题的解空间通常是在搜索问题的解的过程中动态产生的,这是回溯算法的一个重要特性. 话不多说,我们来看几个具体的例子慢