N皇后问题

/*
  问题描述:输入一个正整数N,则程序输出N皇后问题的全部摆法。
            输出结果里的每一行都代表一种摆法。行里的第i个数字
            如果是n,就代表第i行的皇后应该放在第n列。皇后的行、列编号都是从1
            开始计算
 */
#include <iostream>
#include <cmath>
using namespace std;
int N;
int queenPos[100];//用来存放算好的皇后位置,最左上角是(0,0);

void  NQueen(int k)//求解函数
{//在0~k-1行已经摆好的情况下,摆第k行及其以后的皇后
    int i;
    if( k==N)
    {//N个皇后已经摆好
        for( i=0 ;i<N;i++)
            cout<< queenPos[i] + 1<< " ";
        cout <<endl;
        return ;
    }

    for(i=0 ; i<N ; i++)
    {//逐个尝试第k个皇后的位置
        int j;
        for(j = 0 ;j< k; j++)
        {//和已经摆好的k个皇后比较,看是否冲突
            if(queenPos[j] == i||abs(queenPos[j] - i) == abs(k-j))
            {//发生冲突,测试下一个位置
                break;
            }
        }
        if(j == k)
        {//当前位置i和摆好的皇后不冲突
            queenPos[k] = i;//将第k行的皇后摆在第i列并记录下来
            NQueen(k+1);//递归,继续摆放第k+1行
        }
    }
}
int main()
{
    cin>>N;
    NQueen(0);//从第零航开始摆皇后
    return 0;
}

运行结果:


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值