经典回溯算法——八后问题

/************************************************************************/
/* 八后问题                                                             */
/************************************************************************/
#include <stdio.h>
int count = 0;

//判断当前位置是否能放皇后
int IsCorrect(int i, int j, int (*Q)[8])
{
	int s,t;
	//判断某一行上是否能放皇后
	for(s=i,t=0;t<8;t++)
		if (Q[s][t]==1 && t!=j)
			return 0;

	//判断某一列上是否能放皇后
	for(t=j,s=0;s<8;s++)
		if(Q[s][t]==1 && s!=i)
			return 0;

	//判断左上是否能放皇后
	for(s=i-1,t=j-1;s>=0&&t>=0;s--,t--)
		if(Q[s][t]==1)
			return 0;

	//判断右下是否能放皇后
	for(s=i+1,t=j+1;s<8&&t<8;s++,t++)
		if(Q[s][t]==1)
			return 0;

	//判断右上是否能放皇后
	for(s=i-1,t=j+1;s>=0&&t<8;s--,t++)
		if(Q[s][t]==1)
			return 0;

	//判断左下是否能放皇后
	for(s=i+1,t=j-1;s<8&&t>=0;s++,t--)
		if(Q[s][t]==1)
			return 0;

	//其它情况
	return 1;
}

//放置皇后
void Queen(int j, int (*Q)[8])
{
	int i,k;
	if(j==8)		//如果8个皇后全部放置完毕
	{
		for(i=0;i<8;i++)
		{
			for(k=0;k<8;k++)
				printf("%d ",Q[i][k]);
			printf("\n");
		}
		printf("\n");
		count++;
		return;
	}
	for(i=0;i<8;i++)
		if(IsCorrect(i,j,Q))
		{
			Q[i][j]=1;
			Queen(j+1,Q);
			Q[i][j]=0;
		}
}

int main()
{
	int Q[8][8];
	int i,j;
	for(i=0;i<8;i++)
		for(j=0;j<8;j++)
			Q[i][j]=0;
		Queen(0,Q);

		printf("%d\n",count);
		return 0;
}
时间: 2024-10-06 13:28:57

经典回溯算法——八后问题的相关文章

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

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

回溯算法入门及经典案例剖析(初学者必备宝典)

前言 基于有需必写的原则,并且当前这个目录下的文章数量为0(都是因为我懒QAQ),作为开局第一篇文章,为初学者的入门文章,自然要把该说明的东西说明清楚,于是...我整理了如下这篇文章,作者水平有限,有不足之处还望大家多多指出~~~ 概念 首先,回溯是什么意思?很多初学者都会问这样的一个问题.我们可以举这样一个例子: 1 1 1 1 0 1 0 1 0 1 0 1 0 1 1 1 我们看到了如图所示的一个4*4的迷宫了,我们假设数字1标记的位置为道路,数字0标记的位置为一堵墙,一个人由起点(0.0

【八皇后问题】 回溯算法

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

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

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

经典白话算法之二叉树中序前序序列(或后序)求解树

这种题一般有二种形式,共同点是都已知中序序列.如果没有中序序列,是无法唯一确定一棵树的. <1>已知二叉树的前序序列和中序序列,求解树. 1.确定树的根节点.树根是当前树中所有元素在前序遍历中最先出现的元素. 2.求解树的子树.找出根节点在中序遍历中的位置,根左边的所有元素就是左子树,根右边的所有元素就是右子树.若根节点左边或右边为空,则该方向子树为空:若根节点 边和右边都为空,则根节点已经为叶子节点. 3.递归求解树.将左子树和右子树分别看成一棵二叉树,重复1.2.3步,直到所有的节点完成定

寻找连通线,参考八后算法递归,可用于验证码去除连续干扰线

寻找连通线,参考八后算法递归,可用于验证码去除连续干扰线 https://github.com/isee15/captcha-ocr/blob/master/src/cn/z/NoiseLine.java package cn.z; import java.awt.Color;import java.awt.image.BufferedImage;import java.io.File;import java.io.IOException; import javax.imageio.ImageI

回溯算法-C#语言解决八皇后问题的写法与优化

结合问题说方案,首先先说问题: 八皇后问题:在8X8格的国际象棋上摆放八个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行.同一列或同一斜线上,问有多少种摆法. 嗯,这个问题已经被使用各种语言解答一万遍了,大多还是回溯法解决的. 关于回溯算法:个人理解为就是优化的穷举算法,穷举算法是指列出所有的可能情况,而回溯算法则是试探发现问题"剪枝"回退到上个节点,换一条路,能够大大提高求解效率. 具体到8皇后问题上来说,需要考虑以下几点: 1)将8个皇后定义为8行中的相对位置来标识,考虑增

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

八皇后问题 八皇后问题,是一个古老而著名的问题,是回溯算法的典型案例.该问题是国际西洋棋棋手马克斯·贝瑟尔于1848年提出:在8×8格的国际象棋上摆放八个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行.同一列或同一斜线上,问有多少种摆法. 代码实现 static int count = 0;//记录有几种方法 int max = 8;//max表示几个皇后 int[] arr = new int[max];//用一个数组表示,其中arr[n]表示放在第arr[n]+1列,n表示第n+1个

计科1111-1114班第一次实验作业(NPC问题——回溯算法、聚类分析)

实验课安排 地点: 科技楼423 时间:  计科3-4班---15周周一上午.周二下午 计科1-2班---15周周一下午.周二晚上(晚上时间从18:30-21:10) 请各班学委在实验课前飞信通知大家. 实验内容 (1)八皇后及N皇后问题 八皇后问题,是一个古老而著名的问题,是回溯算法的典型案例.该问题是国际西洋棋棋手马克斯·贝瑟尔于1848年提出:在8X8格的国际象棋上摆放八个皇后,使其不能互相攻击,即随意两个皇后都不能处于同一行.同一列或同一斜线上.问有多少种摆法. 高斯觉得有76种方案.1