回溯(su)算法之N皇后问题

这里回溯算法还要好好研究一下

试探一个位置是否有效,如果有效,试探下一个位置(DFS),如果无效则回退

1.定义一个解空间,存放一个解的空间

2.DFS(暂且认为是DFS)

这里N皇后用的是递归+回溯实现的

 1 package com.gxf.backtracking;
 2
 3 /**
 4  * n皇后问题
 5  * @author Administrator
 6  *
 7  */
 8 public class Queen {
 9     int num_queen;                                    //皇后个数
10     int solution[];                                    //solution[i] = k表示第i行皇后在第k列    ,solution为解空间
11     int sum = 0;
12
13     public Queen(int num){
14         num_queen = num;
15         solution = new int[num_queen + 1];
16     }
17
18     /**
19      * 第k个皇后的位置是否有效
20      * 第k个皇后的列保存在solution[k]中,与前面k-1个皇后比较
21      * @param k
22      * @return
23      */
24     boolean isValid(int k){
25         for(int i = 1; i < k; i++){
26             if(solution[i] == solution[k] || Math.abs(k - i) == Math.abs(solution[k] - solution[i]))
27                 return false;
28         }
29         return true;
30     }
31
32     /**
33      * 开始放第n个皇后
34      * @param queen
35      */
36     public void placeQueen(int n){
37         if(n > num_queen)
38         {
39             showSolution();
40             System.out.println();
41             sum++;
42         }
43         else
44             for(int i = 1; i <= num_queen; i++){
45                 solution[n] = i;                        //n个皇后放到i列
46                 if(isValid(n))
47                     placeQueen(n + 1);
48             }
49     }
50
51     /**
52      * 将结果打印出来
53      */
54     public void showSolution(){
55         for(int i = 1; i <= num_queen; i++){
56             for(int j = 1; j <= num_queen; j++){
57                 if(j == solution[i])
58                     System.out.print(‘Q‘ + " ");
59                 System.out.print(0 + " ");
60             }
61             System.out.println();
62         }
63     }
64
65     public static void main(String[] args) {
66         Queen queen = new Queen(4);
67
68         queen.placeQueen(1);
69         System.out.println("sum = " + queen.sum);
70     }
71
72 }

时间: 2024-11-08 05:07:43

回溯(su)算法之N皇后问题的相关文章

蓝桥杯 算法提高 8皇后&#183;改 -- DFS 回溯

  算法提高 8皇后·改   时间限制:1.0s   内存限制:256.0MB 问题描述 规则同8皇后问题,但是棋盘上每格都有一个数字,要求八皇后所在格子数字之和最大. 输入格式 一个8*8的棋盘. 输出格式 所能得到的最大数字和 样例输入 1 2 3 4 5 6 7 89 10 11 12 13 14 15 1617 18 19 20 21 22 23 2425 26 27 28 29 30 31 3233 34 35 36 37 38 39 4041 42 43 44 45 46 47 48

递归之回朔算法应用----八皇后问题

从前,有个皇帝,取了八个皇后,由此产生一系列乱七八糟的问题,八皇后问题由此产生.哈哈 开个玩笑~~~~ 八皇后问题,是一个古老而著名的问题,是回溯算法的典型案例.该问题是国际西洋棋棋手马克斯·贝瑟尔于1848年提出:在8X8格的国际象棋上摆放八个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行.同一列或同一斜线上,问有多少种摆法. 高斯认为有76种方案.1854年在柏林的象棋杂志上不同的作者发表了40种不同的解,后来有人用图论的方法解出92种结果.计算机发明后,有多种方法可以解决此问题.

这是递归和回溯的算法 是abcd&#39;的排列可能

#include<stdio.h>#include<iomanip>#include<iostream>using namespace std;bool b[10]={0};int a[10]={0};int print(){ for (int i=1;i<=4;i++) printf("%c ",a[i]); printf("\n");} int dosomething(int z){ int mm; for ( mm=1

javascript 回溯寻路算法

最近一直在手游 caveboy escape(安卓上,不知道IOS上有没有,可以下来玩玩). 游戏规则是,在5x5的矩阵,从最下面的起点,每个颜色走三步,到达最上面的重点. 想写个js版本.碰到第一个问题就是,矩阵布局,寻路算法. 网上搜了下只有 PathFinding.js 带有的著名的 A*寻路法(自己百度) 源码: https://github.com/qiao/PathFinding.js DEMO: http://qiao.github.io/PathFinding.js/visual

一步一步写算法(之八皇后)

原文:一步一步写算法(之八皇后) [ 声明:版权所有,欢迎转载,请勿用于商业用途.  联系信箱:feixiaoxing @163.com] 八皇后是一道很具典型性的题目.它的基本要求是这样的:在一个8*8的矩阵上面放置8个物体,一个矩阵点只允许放置一个物体,任意两个点不能在一行上,也不能在一列上,不能在一条左斜线上,当然也不能在一条右斜线上. 初看到这道题目,大家的第一印象是遍历,但是经过实践之后发现遍历其实不好写,而且复杂度很低.不仅需要遍历8*8*8*8*8*8*8*8*8 = 2^24次数

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

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

回溯算法之8皇后问题

using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace SeqListSort { /// <summary> /// 8皇后算法 /// <ather> /// <lihonglin> /// </ather> /// </summary> class EightQueen { private const in

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

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

C语言回溯算法解决N皇后问题

回溯算法的模型是 x++, not satisfy ? x-- : continue. 代码中x作列号,y[x]保存第x列上皇后放置的位置. 1 #include<stdio.h> 2 #include<math.h> 3 #define N 5 4 int position_check(int,int*); 5 void print_board(int count,int* y); 6 int main() 7 { 8 int y[N]= {0}; //记录每列上的皇后放的位置