递归:N皇后问题

1.问题

在国际象棋中,皇后的移动方式为横竖交叉的,因此在任意一个皇后所在位置的水平、竖直、以及45度斜线上都不能出现皇后的棋子,例子

图片描述



2.思路

每个皇后必须放在不同行、不同列上、不同斜线上

3.代码

#include <iostream>
#include <cmath>
using namespace std;

int N;
int queenPos[100];
//用来存放好的皇后位置。最左上角是(0,0);

void NQueen(int k)//前k-1个摆放好的前提下吗,摆放第 k个
{

    int i;
    if(k == N){ //N个皇后已经摆好
        for(i=0; i < N; i++)
            cout << queenPos[i] + 1 << " ";
        cout << endl;
        return;
    }
    //2.在 第 k 行上,逐个尝试第k个皇后的位置
    for(i=0; i < N; i++){
        int j;
        for(j=0; j < k; j++){
            //和已经摆好的 k 个皇后 的位置比较,看是否冲突。
            //冲突1:在同一列上
            //冲突2:斜线上,行差=列差
            if(queenPos[j] == i || 
                abs(queenPos[j] - i) == abs(k-j))
            {
                break;
            }
        }
        if (j == k)//当前位置 i 不冲突
        {
            queenPos[k] = i;
            NQueen(k+1);
        }
    }
}
int main()
{
    cin >> N;
    NQueen(0);//从第 0 行开始摆放
    return 0;
}

猜你喜欢

转载自blog.csdn.net/yajie_china/article/details/80330447