用递归替代多重循环
什么是N皇后:
在n×n格的棋盘上放置彼此不受攻击的n个皇后。按照国际象棋的规则,皇后可以攻击与之处在同一行或同一列或同一斜线上的棋子。n皇后问题等价于在n×n的棋盘上放置n个皇后,任何2个皇后不妨在同一行或同一列或同一斜线上。
#include <iostream>
#include <cmath>
using namespace std;
int N;
int queenPos[100];//记录每一横行中,皇后所放的列位置
void NQueen(int k);int main( )
{cin >> N;NQueen(0);//从数组起始位置开始,进行递归求解
}void NQueen(int k)
{if (k == N){for (int i = 0; i < N; i++)cout << queenPos[i] + 1 << " ";cout << endl;}else{for (int i = 0; i < N; i++)//当前行遍历所有列的皇后位置是否可行,i+1位列位置{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;NQueen(k + 1);//正向递归求解k+1}}}
}