程序设计与算法(二)算法基础-郭炜 2.3.1 N皇后问题
用递归替代多重循环
n皇后问题:输入整数n,要求n个国际象棋的皇后,摆在n*n的棋盘上,互相不能攻击,输出全部方案。
输入一个正整数N,则程序输出N皇后问题的全部摆法。输出结果里的每一行都代表一种摆法。行里的第i个数字如果是n,就代表第i行的皇后应该放在第n列。
皇后的行、列编号都是从1开始算。
样例输入:
4
样例输出:
2 4 1 3
3 1 4 2
c++代码如下:
#include <iostream>
#include <cmath>
using namespace std;
int N;
int queenPos[100];
//用来存放算好的皇后位置,最左上角是(0,0)
void NQueen(int 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;
NQueen(k + 1);
}
}
}
int main()
{
cin >> N;
NQueen(0); //从第0行开始摆皇后
return 0;
}