回溯算法--八皇后问题

问题描述:八皇后不能相互攻击,即,八个皇后不能同行,同列,不同在同一条对角线上,

对角线又可以分为左对角线和右对角线

左对角线上满足:i-j+7都相等(i,j分别是一维和二维的坐标)

右对角线满足:i+j 都相等

代码如下:

#include <iostream>
using namespace std;

int e_q[8][8];
int r[15];
int le[15];
int q[8];
int count = 0;

void en_queens(int);

int main()
{
        for(int i=0;i<15;i++)
        {
                 r[i] = 0;
                 le[i]    = 0;
        }

        for(int i =0;i<8;i++)
        {
              q[i]        = 0;
               for(int j=0;j<8;j++)
               {
                     e_q[i][j] = 0;
               }
        }

        en_queens(0);
        cout<<endl;
        cout<<"总共有"<<count<<"个方法"<<endl;
        return 0;
}

void en_queens(int line)
{
         if(line == 8)
         {
                   count++;
                    for(int i =0;i<8;i++)
                    {
                           for(int j=0;j<8;j++)
                           {
                                   cout<<e_q[i][j]<<"   ";
                           }
                           cout<<endl;
                    }
                   cout<<endl;
                    return;
         }

         for(int c=0; c<8; c++)
         {
                  if(q[c] == 0 && r[line+c] == 0 && le[line-c +7] == 0)
                  {
                            e_q[line][c] = 1;
                            q[c]               = 1;
                            r[line+c] = 1;
                            le[line-c+7] = 1;
                             en_queens(line+1);
                             e_q[line][c] = 0;
                              q[c]               = 0;
                              r[line+c]      = 0;
                              le[line-c+7]=0;
                  }

         }
}
时间: 2024-08-10 15:11:55

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

回溯算法之八皇后问题

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个解.最后一行是解的总个数. //以下的