八皇后回溯递归 40行不到

个人感觉代码还算精简,比较容易混淆的一点是,board[] 数组,数组下表指的是八皇后棋盘的行,数组下标对应的值指的是八皇后棋盘的列,至于abs()可以去百度,是一个求绝对值的函数

#include <iostream>
using namespace std ;
#define N 8
static int sum = 0 ;
const int max = N ;
void print (int board []) {
	for(int i = 0 ;i < max ;i++) {
		cout <<board[i]+1<<"  " ;
	}
	cout<<endl;
	sum ++ ;
}
bool judge (int board[], int x ) {
	for (int i = 0 ; i< x ;i++) {
		if(board [i] == board[x] || abs(board[i] - board[x]) == (x-i)) {
			return false ;
		}
	}
	return true ;
}
void Queen (int board[] , int x) {
	if (x == max) {
		print (board) ;
		return ;
	}
	for (int i =0 ; i<max ;i++) {
		board [x] = i;
		if(judge(board, x)) {
			Queen(board,x+1) ;
		}
	}
}
int main () {
	int board[max] ;
	Queen(board , 0 ) ;
	cout << "total is :"<<sum ;
	return 0 ;
}
时间: 2024-07-31 14:34:46

八皇后回溯递归 40行不到的相关文章

八皇后问题——递归+回溯法

八皇后问题,是一个古老而著名的问题,是回溯算法的典型案例.该问题是国际西洋棋棋手马克斯·贝瑟尔于1848年提出:在8X8格的国际象棋上摆放八个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行.同一列或同一斜线上,问有多少种摆法. 高斯认为有76种方案.1854年在柏林的象棋杂志上不同的作者发表了40种不同的解,后来有人用图论的方法解出92种结果. 求解过程: 采用遍历的办法,就是采用将每种情况都验证的办法最终找出问题的解,但是蛮力遍历的话,需要遍历的数据量太大,计算时间花费太大,所以在遍历

java实现八皇后问题(递归和循环两种方式)

循环方式: package EightQueens; public class EightQueensNotRecursive { private static final boolean AVAILABLE = true; private int squares = 8, norm = squares - 1; private int positionInRow[] = new int[squares]; private int p=-1; private boolean[] rows = n

八皇后问题递归代码

听了下别人的讲解后,最后仔细理解了下所谓的八皇后问题. 怎么说呢,感觉有点像搜索的做法. #include<stdio.h> int count=0; //row行,j列: int notDanger(int row,int j,int (*chess)[8]){ int i,k,flag1=0,flag2=0,flag3=0,flag4=0,flag5=0; //注意这里row与j不能直接使用: //判断列的方向有无危险: for(i=0;i<8;i++){ if(*(*(chess+

八皇后问题 递归实现 C语言 超详细 思路 基础

八皇后问题 :假设 將八个皇后放到国际象棋盘上,使其两两之间无法相互攻击.共有几种摆法? 基础知识: 国际象棋里,棋盘为8X8格. 皇后每步可以沿直线.斜线 走任意格. 思路: 1.想把8个皇后放进去,肯定最终每行只有一个皇后,每列只有一个皇后. 2.设个二维数组chess [ i ] [ j ] 模拟棋盘,cas存放摆法.i j 是表示i行j列: 写一个用于递归的函数,思路如下 3.从上往下一行行的放皇后,放下一行时从最左边(第0列)放起,如果不能放就往右挪一格再试.注意判断右边有没有越界出棋

八皇后回溯计算法研究

仔细看了下百度中的回溯法介绍,这是一种非常有用的算法,大概有两种模式,一种是遍历,一种是递归. 我把这两种方法都列出来了,按网上的说法,递归效率要比遍历快很多,我这里测试是一样的,可能是网络上那些遍历法根本没优化好吧, 多遍历了很多东西. 网上并没有Delphi的原代码,我综合了各种算法,将N阶皇后的算法一并写出来了.以下是原代码,希望有意研究的朋友跟我留言: //工程文件:Queen8.dpr,以下代码在Delphi2010下编译通过. program Queen8; uses  Forms,

20150410 递归实现八皇后问题

20150410 递归实现八皇后问题 2015-04-10 Lover雪儿 十九世纪著名的数学家高斯1850年提出: 在8x8格的国际象棋上摆放八个皇后,使其不能互相攻击,即任意的连个皇后都不能处于同一行.同一列或者统一斜线,问有多少种摆法. 以下是其中一种解法,如图所示: 当年高斯先生没日没夜的计算,得出结论是76种. 其实正确的结论是92中,此处我们就来编程计算一下正确的答案. 1 //八皇后问题 2 #include <stdio.h> 3 4 static int count = 0;

算法入门经典-第七章 例题7-2 八皇后问题

原本利用回溯思想解决的经典八皇后问题,其实也是可以用递归解决的~ 八皇后的递归解决思路: 从第一行开始,依次判断0~8列的哪一列可以放置Queen,这样就确定了该行的Queen的位置,然后行数递增,继而递归实现下一行的判断,依次类推直到行数增加到8(行数从0开始的),此时为递归-----归的条件,即表示一种八皇后的解决方法完成,打印结果:之后进行下一种解决方法的寻找,大致思路个人理解是这样 noDanger(row,j,(*chess)[8])函数是判断第row行第j列是否可以放置Queen #

八皇后92

#include <stdlib.h>   #include <stdio.h>       int m[8][8] = {0};//表示棋盘,初始为0,表示未放置皇后   int num = 0;//解数目     //对于棋盘前row-1行已放置好皇后   //检查在第row行.第column列放置一枚皇后是否可行    bool check(int row,int column)    {        if(row==1) return true;        int i

八皇后和全排列

经典的递归程序设计中的2到题目 1.八皇后问题 国际象棋棋盘走法,用递归实现所有的可能性: 棋盘: (1).代码如下: #include<stdio.h> typedef unsigned char boolean; #define TRUE        1 #define FALSE        0 #define EIGHT    8 void showChess(int (*chess)[EIGHT]);  //显示棋盘 boolean isSafe(int (*chess)[EIG