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

从前,有个皇帝,取了八个皇后,由此产生一系列乱七八糟的问题,八皇后问题由此产生。哈哈

开个玩笑~~~~

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

具体算法:

#include "stdafx.h"
#include <stdlib.h>
#define N 8

typedef struct _tag_Pos
{
    int ios;
    int jos;
} Pos;

static char board[N+2][N+2];
static Pos pos[] = { {-1, -1}, {-1, 0}, {-1, 1} };
static int count = 0;

void init()
{
    int i = 0;
    int j = 0;

    for(i=0; i<N+2; i++)
    {
        board[0][i] = '#';
        board[N+1][i] = '#';
        board[i][0] = '#';
        board[i][N+1] = '#';
    }

    for(i=1; i<=N; i++)
    {
        for(j=1; j<=N; j++)
        {
            board[i][j] = ' ';
        }
    }
}

void display()
{
    int i = 0;
    int j = 1;

    for(i=0; i<N+2; i++)
    {
        for(j=0; j<N+2; j++)
        {
            printf("%c", board[i][j]);
        }

        printf("\n");
    }
}

int check(int i, int j)
{
    int ret = 1;
    int p = 0;

    for(p=0; p<3; p++)//在三个方向寻找
    {
        int ni = i;
        int nj = j;

        while( ret && (board[ni][nj] != '#') )
        {
            ni = ni + pos[p].ios;
            nj = nj + pos[p].jos;

            ret = ret && (board[ni][nj] != '*');
        }
    }

    return ret;
}

void find(int i)
{
    int j = 0;

    if( i > N )
    {
        count++;

        printf("Solution: %d\n", count);

        display();

        getchar();
    }
    else
    {
        for(j=1; j<=N; j++)
        {
            if( check(i, j) )
            {
                board[i][j] = '*';

                find(i+1);

                board[i][j] = ' ';
            }
        }
    }
}

int main()
{
    init();
    find(1);

	system("pause");
    return 0;
}

结果:八皇后共有92中解法,这里就不一一的列出来了。

具体看自己的运行结果吧~~~~~

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

时间: 2024-10-12 12:41:20

递归之回朔算法应用----八皇后问题的相关文章

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

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

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

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

算法系列——八皇后问题

public class Queen { private final int size; private int[] location; private int[] columnOccupied; private int[] lineOccupied; //对角线 private int[] reverseLineOccupied; //反对角线 private static int solveCount; private static final int locationOccupied =

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

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

回溯算法(八皇后问题)

八皇后问题 在国际象棋中,皇后是最强大的一枚棋子,可以吃掉与其在同一行.列和斜线的敌方棋子. 将八个皇后摆在一张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

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

回朔算法的基本思想 ·从问题的某一种状态出发,搜索可以到达的状态 ·当某个状态到达后,可向前回退,并继续搜索其他可达状态 ·当所有状态都到达后,回朔算法结束 程序设计中可以利用函数的活动对象保存回朔算法的状态数据,因此可以利用递归完成回朔算法. 八皇后算法 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

八皇后(JAVA算法实现)

在学习现代软件工程构建之法这门课时,老师要求发表一篇博客,使用JAVA算法实现八皇后问题的求解.写这篇博客时,我学习了一些其他的博客,因为我常常遇到问题,自己无法解决时,向他人学习也是一种方法. 国际西洋棋棋手马克斯·贝瑟尔于1848年提出:在8×8格的国际象棋上摆放八个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行.同一列或同一斜线上,问有多少种摆法. 我们可以逐行或者逐列来进行可行摆放方案的遍历,每一行(或列)遍历出一个符合条件的 位置,接着就到下一行或列遍历下一个棋子的合适位置,这

c++ 八皇后问题(转载)

转自 雪狼的程序故事 http://www.cnblogs.com/gaoteng/archive/2012/04/11/2442692.html 经典回溯算法(八皇后问题) 今天偶尔看到了一个算法问题(八皇后问题),回想一下还是在算法课上学习过的,于是,自己总结了一下,写了这篇日志 算法提出: 在国际象棋棋盘上(8*8)放置八个皇后,使得任意两个皇后之间不能在同一行,同一列,也不能位于同于对角线上.问共有多少种不同的方法,并且指出各种不同的放法. 算法思路: 首先我们分析一下问题的解,我们每取

python解决八皇后问题

经典回溯算法:八皇后问题 算法要求: 在国际象棋棋盘上(8*8)放置八个皇后,使得任意两个皇后之间不能在同一行,同一列,也不能位于同于对角线上. 国际象棋的棋盘如下图所示: 问共有多少种不同的方法,并且指出各种不同的放法. # -*- coding:utf-8 -*- __author__ = "tyomcat" print("******八皇后问题的解决方法******") def next_col(current, n=8): length = len(curr