Loading

n皇后问题

问题:n皇后问题:输入整数n,要求n个国际象棋的皇后,摆在n*n的棋盘上,互相不能攻击,输出全部方案。输出结果里的每一行都代表一种摆法。行里的第i个数字如果是n,就代表第i行的皇后应该摆放在第n列。皇后的行、列编号都是从1开始算。

样例输入:

4

样例输出:

2 4 1 3

3 1 4 2

 

代码:

#include "stdafx.h"
#include <iostream>
#include <algorithm>
#include <cmath>

using namespace std;

int N;
int queenPos[100];

//在0到k-1行皇后已经摆好的情况下,摆第k行及其后面的皇后
void NQueen(int 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++)
    {
        int j;
        for(j = 0;j<k;j++)
        {
            //和已经摆好的k个皇后的位置比较,看是否冲突
            if(queenPos[j]==i || abs(queenPos[j]-i)==abs(k-j))
            {
                break;
            }
        }
        if(j==k)
        {
            queenPos[k] = i;//将第k个皇后摆放在位置i
            NQueen(k+1);
        }
    }
}

int _tmain(int argc, _TCHAR* argv[])
{
    cin>>N;
    NQueen(0);
    return 0;
}

 

posted @ 2017-12-19 10:34  guwei4037  阅读(208)  评论(0编辑  收藏  举报