递归思想完成n皇后问题

已经很长时间不敲代码了,感觉自己越来与颓废,所以现在又想做回一名苦逼的程序员,开启自己的代码之路。

我是根据视频敲的,没有题目,先看个四皇后问题吧。

所谓4皇后问题就是求解如何在4×4的棋盘上无冲突的摆放4个皇后棋子。在国际象棋中,皇后的移动方式为横竖交叉的,因此在任意一个皇后所在位置的水平、竖直、以及45度斜线上都不能出现皇后的棋子,例子

要求编程求出符合要求的情况的个数

n皇后问题就是将4转化为变量n。

用递归的方法首先要找到递归出口,这里我设用k循环所有行N,当k=N时,循环结束。这里的k表示前0~k-1行已经放置好了,没毛病。

出口判断好了之后就是找判断条件,就是上文中红色字体。

具体代码如下:

#include <iostream>
#include <cmath>
using namespace std;
int N;
int queenPos[100];
void NQueen(int k);

int main()
{
    cin>>N;
    NQueen(0);
    return 0;
}
void NQueen(int k){
    int i;
    if(k==N){
        for(i=0;i<N;i++)
            cout<< queenPos[i]+1 << " ";
        cout<<endl;
        return;
    }
    for(i=0;i<N;i++){
        int j;
        for(j=0;j<k;j++){
            if(queenPos[j]==i||abs(queenPos[j]-i)==abs(k-j)){
                break;
            }
        }
            if(j==k){
                queenPos[k]=i;
                NQueen(k+1);
            }

    }
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值