N皇后问题--递归的应用(C++)

N皇后问题:

即在一个n*n 的棋盘上,放置n个皇后,所放置的n个皇后不能在同一行,同一列,同一条斜线上。

问总共有多少种放法。

解决这个问题,可以用递归的方法。

先用语言描述一下放置过程:

比如首先在棋盘的1行1列上摆放一个皇后,然后继续从第二列开始摆放,原则是不能放在同一行、同一列、同一对角线上,那么就从第二列的第一行开始尝试,一直到第n行。如果在尝试的过程中有满足条件的摆放方式,那么继续在第三列摆放,再从第三列的第一行开始尝试.......如此循环往复。

本题的第一个难点就在于如何判断不在同一行、同一列、同一对角线上。

第二个难点在于如何使用递归。

下面附上代码:

#include <iostream>
#include<cmath>
using namespace std;
int n=4;                                //设定为四皇后问题
int sum = 0;                            //摆放方式
int *x=new int[n];              //开辟数组来存放所摆放的行数

int place(int t)
{
    for(int i=0; i<t; i++)                                      //与之前所摆放的位置相比较
    {
        if(abs(x[t]-x[i])==abs(t-i)||(x[t]==x[i]))      //判断是否在同一行或是否在同意对角线上
        {
            return false;                       //如果if语句成立,那么返回false,继续判断下一行是否成立
        }
    }
    return true;                                //如果if语句不成立,那么继续在下一列摆放
}


int queen(int t)                //t表示摆放的列
{
    for(int i=0; i<n; i++)
    {
        x[t] = i;                   //此时的i表示的是皇后所在的行,即x[t]所表示的是行。
        if(place(t))
        {
            if(t==n-1)         //注意,此时n-1为最大下标!
            {
                for( i=0; i<n; i++)             //将皇后坐在的行位置输出
                {
                    cout<<x[i]+1<<" ";  //因为i从0开始,即从第0行开始摆放,所以行数+1
                }
                cout<<endl;
                sum++;
            }
            else
        {
            queen(t+1);
        }
        }

    }
}

int main()
{
    queen(0);                       //从第0行开始摆放
    cout<<"共有"<<sum<<"种摆放方法。"<<endl;

    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值