回溯算法(八皇后问题)

八皇后问题

在国际象棋中,皇后是最强大的一枚棋子,可以吃掉与其在同一行、列和斜线的敌方棋子。

将八个皇后摆在一张8*8的国际象棋棋盘上,使每个皇后都无法吃掉别的皇后,一共有多少种摆法?

程序实现

程序摘自回溯法与八皇后问题

#include<iostream>
#include<math.h>
using namespace std;

int n=8;
int total=0;
int *c=new int(n);                    //下标为行数,存的数为列数

bool is_ok(int row){
    for(int j=0;j!=row;j++){
        if(c[row]==c[j] ||              //检测是否在同一列
            row-c[row]==j-c[j] ||    //检测是否在同一”\“斜线上
            row+c[row]==j+c[j])    //检测是否在同一"/"斜线上
            return false;
    }
    return true;
}

void queen(int row){
    if(row==n)
        total++;
    else
        for(int col=0;col!=n;col++){
            c[row]=col;
            if(is_ok(row))
                queen(row+1);
        }
}

int main(){
    queen(0);
    cout<<total;
    return 1;
}

原文地址:https://www.cnblogs.com/narjaja/p/9581765.html

时间: 2024-10-12 07:54:04

回溯算法(八皇后问题)的相关文章

回溯算法之八皇后问题

1 package 回溯; 2 3 public class 八皇后递归回溯 { 4 5 private int length; //皇后数量 6 private int sum; //总方案数 7 private int num[]; //存放皇后的一维数组 8 9 public 八皇后递归回溯() { 10 length = 8; 11 sum=0; 12 num = new int[length + 1]; 13 } 14 15 public boolean check(int x) {

回溯法和八皇后问题

一.回溯法 回溯法(探索与回溯法)是一种选优搜索法,又称为试探法,按选优条件向前搜索,以达到目标.但当探索到某一步时,发现原先选择并不优或达不到目标,就退回一步重新选择,这种走不通就退回再走的技术为回溯法,而满足回溯条件的某个状态的点称为“回溯点”. 二.八皇后问题 (一)问题描述 在国际象棋中,皇后是最强大的一枚棋子,可以吃掉与其在同一行.列和斜线的敌方棋子.比中国象棋里的车强几百倍,比她那没用的老公更是强的飞起(国王只能前后左右斜线走一格). 八皇后问题是这样一个问题:将八个皇后摆在一张8*

LeetCode 31:递归、回溯、八皇后、全排列一篇文章全讲清楚

本文始发于个人公众号:TechFlow,原创不易,求个关注 今天我们讲的是LeetCode的31题,这是一道非常经典的问题,经常会在面试当中遇到.在今天的文章当中除了关于题目的分析和解答之外,我们还会详细解读深度优先搜索和回溯算法,感兴趣的同学不容错过. 链接 Next Permutation 难度 Medium 描述 实现C++当中经典的库函数next permutation,即下一个排列.如果把数组当中的元素看成字典序的话,那下一个排列即是字典序比当前增加1的排列.如果已经是字典序最大的情况

生活日用算法——八皇后问题

八皇后问题也算是比较经典的回溯算法的经典案例.题干描述如下: 在 8×8 格的国际象棋上摆放八个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行.同一列或同一斜线上,问有多少种摆法 对此首先我们使用array[][]来构建一个棋盘,然后尝试落子,此时算法如下: /** * 寻找皇后节点 * @param row * @param size */ public static void findQueen(int row, int size) { // 如果皇后行已达到最后一行,结果数量自增,

【Python】生成器、回溯和八皇后问题

八皇后问题: 把N个皇后,放在N*N的棋盘上面,从第一行往下放,每个皇后占一行,同时,每个皇后不能处在同一列,对角线上,有多少种放置方法. 思路: 典型的回溯问题: 1.当要放置最后一个皇后时候,默认前N-1个皇后已经全部放置好了,那么验证在第N行上的每个位置是否可行,即是否与之前的皇后在同一列或者对角线即可: 2.如果放置的不是最后一个皇后,则回溯.回溯至刚开始放第一个元素时候,然后不断的返回上一层.每一层都认为下一层传递给自己的是正确的信息 1 def isconflict(state, n

回溯算法————n皇后、素数串

回溯就是算法是搜索算法中一种控制策略,是一个逐个试探的过程.在试探的过程中,如果遇到错误的选择,就会回到上一步继续选择下一种走法,一步一步的进行直到找到解或者证明无解为止. 如下是一个经典回溯问题n皇后的解答树: 下面就从n皇后说起: [问题描述] 在n×n的国际象棋盘上,放置n个皇后,使任何一个皇后都不能吃掉另一个,需满足的条件是:同一行.同一列.同一对角线上只能有一个皇后.求所有满足要求的放置方案.4皇后的放置方案如下: [输入]一个正整数n. [输出]每行代表一种放置方案:第i行的第一个数

迷宫回溯和八皇后问题

递归的概念 简单的说:递归就是方法自己调用自己,每次调用同时传入不同的变量,递归有助于编程者解决复杂的问题,同时可以让代码变得简洁 package recusion; public class RecursionTest { public static void main(String[] args) { test(5); int i = factorial(5); System.out.println(i); } //打印问题 //当程序执行到一个方法时,就会开辟一个独立的栈空间 public

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

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

每天刷个算法题20160519:回溯法解八皇后

版权所有.所有权利保留. 欢迎转载,转载时请注明出处: http://blog.csdn.net/xiaofei_it/article/details/51502622 为了防止思维僵化,每天刷个算法题.已经刷了几天了,现在发点代码. 我已经建了一个开源项目,每天的题目都在里面: https://github.com/Xiaofei-it/Algorithms 绝大部分算法都是我自己写的,没有参考网上通用代码.读者可能会觉得有的代码晦涩难懂,因为那是我自己的理解. 最近几天都是在写一些原来的东西

洛谷 P1219 八皇后【经典DFS,温习搜索】

P1219 八皇后 题目描述 检查一个如下的6 x 6的跳棋棋盘,有六个棋子被放置在棋盘上,使得每行.每列有且只有一个,每条对角线(包括两条主对角线的所有平行线)上至多有一个棋子. 上面的布局可以用序列2 4 6 1 3 5来描述,第i个数字表示在第i行的相应位置有一个棋子,如下: 行号 1 2 3 4 5 6 列号 2 4 6 1 3 5 这只是跳棋放置的一个解.请编一个程序找出所有跳棋放置的解.并把它们以上面的序列方法输出.解按字典顺序排列.请输出前3个解.最后一行是解的总个数. //以下的