`

回溯法之二---8皇后问题

阅读更多
八皇后问题是一个古老而著名的问题,是回溯算法的典型例题。该问题是十九世纪著名的数学家高斯1850年提出:在8X8格的国际象棋上摆放八个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行、同一列或同一斜线上.
问题分析:
第一步 定义问题的解空间
这个问题解空间就是8个皇后在棋盘中的位置.
第二步 定义解空间的结构
可以使用8*8的数组,但由于任意两个皇后都不能在同行,我们可以用数组下标表示
行,数组的值来表示皇后放的列,故可以简化为一个以维数组x[9]。
第三步 以深度优先的方式搜索解空间,并在搜索过程使用剪枝函数来剪枝
根据条件:x[i] == x[k]判断处于同一列
         abs(k-i) == abs(x[k]-x[i]判断是否处于同一斜线
我们很容易写出剪枝函数:
bool canPlace(int k){
	for(int i = 1; i < k; i++){
        //判断处于同一列或同一斜线
	   if(x[i] == x[k] || abs(k-i) == abs(x[k]-x[i])) 		       return false;
	}
	return true;
}

然后我们按照回溯框架一,很容易写出8皇后的回溯代码:
void queen(int i){
	if(i > 8){
		print();
		return;
	}
	for(int j = 1; j <= 8; j++){
	  x[i] = j;//记录所放的列
	  if(canPlace(i)) queen(i+1);
	}
}

整个代码:
#include<iostream>
#include<cmath>
using namespace std;

int x[9];
void print(){
	for(int i = 1; i <= 8; i++)
		   cout << x[i] << " ";
	cout << endl;
}

bool canPlace(int k){
	for(int i = 1; i < k; i++){
            //判断处于同一列或同一斜线
	   if(x[i] == x[k] || abs(k-i) == abs(x[k]-x[i])) 
		   return false;
	}
	return true;
}

void queen(int i){
	if(i > 8){
		print();
		return;
	}
	for(int j = 1; j <= 8; j++){
	  x[i] = j;
	  if(canPlace(i)) queen(i+1);
	}
}

int main(){
  queen(1);
  return 0;
}


2
0
分享到:
评论
1 楼 chen56 2009-02-11  
放不出来吧

相关推荐

    回溯法---n皇后问题,c语言编程

    回溯法---n皇后问题,c语言...回溯法---n皇后问题,c语言编程回溯法---n皇后问题,c语言编程回溯法---n皇后问题,c语言编程回溯法---n皇后问题,c语言编程回溯法---n皇后问题,c语言编程回溯法---n皇后问题,c语言编程

    回溯法解决0-1背包问题

    回溯法适用于解决各种约束条件下求解最优解的问题,如图着色问题、八皇后问题等。它以深度优先搜索为基础,通过剪枝避免了无效的分支,提高了搜索效率。在0-1背包问题中,回溯法能有效地找到背包中物品的最大价值...

    n皇后问题--回溯法实验

    这个问题是计算机科学中经典的问题之一,常被用来教授和理解回溯法。** **C++是编程语言,以其强大的性能和灵活性被广泛用于系统软件、应用软件以及游戏开发等领域。在这个n皇后问题的实验中,我们将使用C++来实现...

    C#回溯法8皇后问题-实验报告+程序

    使用C#编写回溯法解决8皇后问题的实验报告和程序 有图形界面,可以查看任意一种解法

    利用回溯法解决n皇后问题

    **回溯法是一种重要的算法策略,常用于解决组合优化问题,如八皇后问题、迷宫寻路等。在这个场景中,我们关注的是“n皇后问题”。n皇后问题是在一个n×n的棋盘上放置n个皇后,要求任何两个皇后不能处于同一行、同一...

    n 皇后问题n 皇后 回溯法n 皇后 回溯法

    根据给定的信息,本文将详细解释“N皇后问题”及其回溯法求解方案。 ### N皇后问题概述 N皇后问题是指在一个N×N的棋盘上放置N个皇后,使得任意两个皇后都不会互相攻击(即任何两个皇后不能位于同一行、同一列或...

    八皇后问题c++回溯法

    经典的算法,八皇后问题,c++实现,回溯法

    n皇后问题回溯法

    ### n皇后问题回溯法解析 #### 一、问题背景及定义 n皇后问题是一个经典的计算机科学问题。问题描述为:在n×n的棋盘上放置n个皇后,要求这些皇后不能处于同一行、同一列或同一斜线上。本问题通过C++编程语言采用...

    利用回溯法解决8皇后问题

    利用回溯法解决8皇后问题,简单并且和很好理解!

    8-皇后问题回溯法解题C语言

    使用回溯法解决,不仅解决N皇后问题,任一个皇后矩阵均可输出所有的解。

    回溯法-N皇后问题_N皇后回溯法C++_

    总的来说,N皇后问题的回溯法C++实现是一个很好的学习案例,它不仅展示了如何运用回溯法解决复杂问题,还涉及到递归、约束检查和优化策略等多个编程和算法知识点。通过理解和实现这样的程序,可以加深对回溯法的理解...

    实验四 回溯法的应用------跳马算法.doc

    回溯法是一种常用的搜索算法,它可以用来解决复杂的问题。其基本思路是:定义一个问题的搜索空间,然后使用递归回溯的方式来搜索所有可能的解决方案,直到找到一个可行的解决方案。 跳马算法的实现 跳马算法的实现...

    回溯法实现N皇后问题

    **回溯法实现N皇后问题** N皇后问题是一个经典的计算机科学问题,它的目标是在一个N×N的棋盘上放置N个皇后,使得任意两个皇后都不能在同一行、同一列或同一对角线上。这是一个典型的约束满足问题,可以利用回溯法...

    回溯法n后问题实验报告

    ### 回溯法n后问题实验报告知识点解析 #### 实验背景与目的 - **实验背景**:本实验属于华南师范大学计算机软件学院本科生课程“算法分析与设计”中的一项实践内容,旨在通过实际操作加深学生对回溯法的理解与应用...

    回溯法求N皇后问题

    该代码为算法实验中比较典型的问题 回溯法求N皇后位置的问题,代码简单,适合初学者

    N皇后问题(回溯法)

    N皇后问题(回溯法) N皇后问题是计算机科学中的一类经典问题,它是指在一个NxN的棋盘上,如何将N个皇后摆放的方式,使得每个皇后都不会攻击到其他皇后。这个问题可以使用回溯法来解决。 回溯法是一种常用的搜索...

    回溯法解决n皇后问题纯c++编写

    在本案例中,"回溯法解决n皇后问题"是核心知识点,n皇后问题是经典的计算机科学问题,其目标是在n×n的棋盘上放置n个皇后,使得任何两个皇后都无法在同一行、同一列或同一对角线上攻击彼此。 首先,我们需要理解n...

    C++n个皇后回溯法求解

    代码示例中使用了回溯法来求解n皇后问题。具体步骤如下: 1. **定义变量**:定义了一个整型数组`a[n]`用来存储每个皇后所在的列号,其中`n`是棋盘的大小。 2. **函数`place(int k)`**:此函数用于检查第`k`个皇后...

    利用回溯法N-皇后问题

    利用回溯法求解n皇后问题,程序简单,源代码.啊说等等等等等等等等等等等等等等211111111111111111111111111111111111111 23111111111

    回溯法解决N皇后问题

    使用回溯法解决n皇后问题,没有用到栈的结构(但实际算法类似于栈),代码比较简约漂亮

Global site tag (gtag.js) - Google Analytics