八皇后 递归or迭代

递归:

#include <iostream>
#include <cstdlib>
#include <cstdio>
using namespace std;

int que[8]={0},cc=0;
void print()
{
    cc++;
    cout<<cc<<‘:‘;
    for(int i=0;i<=7;i++)
        cout<<que[i]<<‘ ‘;
    cout<<endl;
}
int check(int c)
{
    if(que[c]>8)return 0;
    for(int i=0;i<c;i++)
    {
        if(que[i]==que[c]||que[i]-que[c]==i-c||que[i]-que[c]==c-i)return 0;
    }
    return 1;
}

void queue8(int i)
{
    if(i==8){print();return;}
    for(int j=1;j<=8;j++)
    {
        que[i]=j;
        if(check(i))queue8(i+1);
    }
}

int main()
{
    queue8(0);
}

迭代:

#include <iostream>
#include <cstdlib>
#include <cstdio>
using namespace std;

int que[8]={0},c,count;
void print()
{
    c++;
    cout<<c<<‘:‘;
    for(int i=0;i<=7;i++)
        cout<<que[i]<<‘ ‘;
    cout<<endl;
}
int check(int c)
{
    if(que[c]>8)return 0;
    for(int i=0;i<c;i++)
    {
        if(que[i]==que[c]||que[i]-que[c]==i-c||que[i]-que[c]==c-i)return 0;
    }
    return 1;
}

void queue8()
{
    int cc=0;
    while(count>=0&&count<=7)
    {
        que[count]++;
        if(check(count))
        {
            count++;
        }
        else if(que[count]>8)que[count]=0,count--;
        if(count>7){print();count--;}
    }
}

int main()
{
    queue8();
}
时间: 2024-11-13 09:44:07

八皇后 递归or迭代的相关文章

通过C语言,利用递归回溯的方法,实现八皇后问题的求解

八皇后问题: 在国际象棋8*8的棋盘上,摆放八个皇后且皇后都无法吃掉对方,而八皇后的攻击路线 为它所在的列和行,还有45度斜线. 对于该问题,首先要确定递归的输入和输出,以及终止条件和方法.一个递归完成对当 前行皇后位置的确定,并通过遍历所有列,查找出所有可能.其中,利用对列的遍历实 现回溯. 具体实现方法,可以通过代码理解,以及思路参考https://blog.csdn.net/a304672343/article/details/8029122 参考博客的博主对于八皇后位置的表示处理的很好,

八皇后问题(递归方法详解)

八皇后递归详解 核心代码如下: //八皇后递归解法 #include<iostream> using namespace std; int queen[9] = {-1,-1,-1,-1,-1,-1,-1,-1,-1}; int count = 0;//定义一个全局变量 bool available(int pointi,int pointj) //判断某个皇后是否与已有皇后冲突 { for(int i = 1; i<pointi; i++) { if(pointj == queen[i

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

C#中八皇后问题的递归解法——N皇后

百度测试部2015年10月份的面试题之——八皇后. 八皇后问题的介绍在此.以下是用递归思想实现八皇后-N皇后. 代码如下: using System;using System.Collections.Generic; namespace QueensSolution { class Program { static int count = 0; static void Main(string[] args) { int n = Int32.Parse(Console.ReadLine()); L

八皇后问题,递归法实现

八皇后问题,是19世纪著名的数学家高斯在1850年提出的:在8×8格的国际象棋盘上摆放8个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行.同一列.同一斜线上,试问有多少种摆法?高斯先生给出的答案是“76”种,实际是76种吗? 八皇后问题是回溯算法的典型应用,但是本文提供递归的求法. 递归的核心思想可以总结成:把一个复杂的问题无限缩小,每个小问题的解法都是一样的,最终归结于求解每个小问题的原型.递归编程的思路可以假设所有的问题都已解决,来到结束条件,这是非常简单的,然后再调用自身求解整个问

20150410 递归实现八皇后问题

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

递归的应用——八皇后问题

回朔算法的基本思想 ·从问题的某一种状态出发,搜索可以到达的状态 ·当某个状态到达后,可向前回退,并继续搜索其他可达状态 ·当所有状态都到达后,回朔算法结束 程序设计中可以利用函数的活动对象保存回朔算法的状态数据,因此可以利用递归完成回朔算法. 八皇后算法 1 初始化 I = 1 2 初始化 J = 1 3 从第i行开始,恢复j的当前值,判断第j个位置 A`位置j可放入皇后:标记位置(i,j),i++,转步骤2 B`位置j不可以放入皇后:j++,转至步骤A C`当j>8时,i--,转至步骤3 4

八皇后问题递归代码

听了下别人的讲解后,最后仔细理解了下所谓的八皇后问题. 怎么说呢,感觉有点像搜索的做法. #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+

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

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