八皇后问题 递归求解法

简介:

#include <iostream>
#include <fstream>
#include <string.h>

/**
八皇后问题递归方法实现
*/
using namespace std;

ofstream file;

//用以计数计算结果的数目
int count = 1;
/**
打印的棋盘其中打印1的位置是皇后的位置,0空位。
这里因为在控制台看不到全部,所有做了在文件中输出所有的解
*/
int print_Chessboard(int chessboard[][8])
{

    file.open("data.txt",ofstream::app|ofstream::out);
    file<<"答案:"<<count<<endl;
    cout<<"答案:"<<count<<endl;
    count++;
    for(int row = 0; row < 8;row++)
    {
        for(int column = 0;column<8;column++)
        {
            file<<chessboard[row][column]<<" ";
            cout<<chessboard[row][column]<<" ";
        }
        file<<endl;
        cout<<endl;
    }
     file<<endl<<endl;
     cout<<endl<<endl;
     file.close();
}
/**
参数一将棋盘信息传入函数,
参数二将要放入的皇后的行数传入
参数三将要放入的皇后的列数传入
若皇后放入成功则返回1,若失败则返回0
*/
int check_Chessboard(int chessboard[][8],int row,int column)
{
    //1、首先检查行数和列数是否已经超出棋盘的局限,若超出了
    //说明前边已经都符合位置,此时返回成功系数1
    if(row>=8)
    {
        //打印结果
        print_Chessboard(chessboard);
        return 1;
    }

    //2、检查在这一列上是否有皇后,正上方
    for(int i = 0; i < row;i++)
    {
        if(chessboard[i][column]==1)
        return 0;
    }
    //3、检查在左上和右上斜对角上是否有皇后
    //左上45度
    for(int i=row-1,j=column-1;i>=0&&j>=0;i--,j--)
    {
        if(chessboard[i][j]==1)
        return 0;
    }
    //右上45度
    for(int i=row-1,j=column+1;i>=0&&j<8;i--,j++)
    {
        if(chessboard[i][j]==1)
        return 0;
    }
    //到这里说明摆放成功
    //摆放成功后把这个位置标记为1
    chessboard[row][column]=1;

    //循环的检查下一行的没一个位置
    for(int i = 0; i < 8; i++)
    {
        if(check_Chessboard(chessboard,row+1,i)==0)
        continue;
        else break;
    }
    //若没有摆放成功就返回0;此时需要把该位置重新置为0
    chessboard[row][column]=0;
    return 0;
}
//主调函数
int main()
{
    int chessboard[8][8];

    for(int i = 0; i < 8; i++)
    {
        memset(chessboard,0,sizeof(chessboard));
        check_Chessboard(chessboard,0,i);
    }
    return 0;
}
复制代码

 

以下是运行结果,答案共有92中摆放方法

View Code










本文转自NewPanderKing51CTO博客,原文链接: http://www.cnblogs.com/newpanderking/archive/2012/08/23/2652083.html  ,如需转载请自行联系原作者

相关文章
素因子分解(递归求解)
素因子分解(递归求解)
142 0
|
8月前
|
存储 缓存 算法
动归和递归算法讲解
动归和递归算法讲解
|
9月前
|
算法
动态规划求解超详细介绍 例题+代码
动态规划求解超详细介绍 例题+代码
|
9月前
递归求解汉诺塔问题(超详解)
递归求解汉诺塔问题(超详解)
237 0
|
算法
解密汉诺塔问题:递归与分治的经典探索
解密汉诺塔问题:递归与分治的经典探索
637 0
|
Java
【回溯法】求解多种组合问题【java实现】
【回溯法】求解多种组合问题【java实现】
69 0
|
算法
【递归与递推 3】AcWing 717. 简单斐波那契(求解斐波那契数列的若干方法)
【递归与递推 3】AcWing 717. 简单斐波那契(求解斐波那契数列的若干方法)
111 0
【递归与递推 3】AcWing 717. 简单斐波那契(求解斐波那契数列的若干方法)
|
算法
【算法】 八皇后问题之回溯法
会下国际象棋的人都很清楚:皇后可以在横、竖、斜线上不限步数地吃掉其他棋子。如何将8个皇后放在棋盘上(有8 * 8个方格),使它们谁也不能被吃掉!这就是著名的八皇后问题。每次填满第一行第一列,当不满足时候,试下第一行第二列,依次进行,递归的出口为找到第八个点,跳出递归。,在循环里面还要判断是否满足不同行,不同列,不同对角线。使用回溯法来解决该问题,下面的代码是我看到过的最精简的代码,相关的注释都写在代码上了。运行得出结果,总共有92中结果。
288 0