题目描述
在一个9×9的方格棋盘上放置了9个皇后,使得他们不相互攻击(即任意两个皇后不允许处在同一排,同一列,也不允许许处在与棋盘边框成45°的斜线上。你的任务是输出字典序最小的一组解。
棋盘列位置下标从 1 开始!
输出所有解:
皇后问题可以用递归和回溯实现。
#include<iostream>
#include<algorithm>
#include<cmath>
const int manx=9;
int row[manx];
using namespace std;
int k=1;
void queen(int now)
{
if(k==1)
if(now==manx)
{
for(int i=0;i<manx;i++)
{
cout<<row[i]+1<<" ";
}
cout<<endl;
k=0;
return;
}
int i,j;
for(i=0;i<manx;i++)//i表示正在放入的皇后位子
{
for(j=0;j<now;j++)//j表示已经放好的皇后位子
{
if(i==row[j]||abs(now-j)==abs(i-row[j]))
break;
}
if(j==now)
{
row[now]=i;
queen(now+1);
}
}
}
int main()
{
queen(0);
return 0;
}
输出最小子序列的一组解:(九皇后最小子序列的一组解)
思路:主要就要有一个标志,同时就是要注意这个标志的位置。并且这个标志要定义在全局变量中,否则就会输出所有解。一定要注意标志不能设置在函数中,否则输出全部解。具体代码如下:
#include <cstdio>
#include <cmath>
#include <iostream>
using namespace std;
int row[8];
int k=1;
void nqueen(int now){
if(now == 8){
for(int i = 0; i < 8; i++){
cout << row[i] << ' ';
}
cout << endl;
}
}
int j;
for(int i = 0; i < 8; i++){
for(j = 0; j < now; j++){
if(i == row[j] || abs(now - j) == abs(i - row[j]))
break;
}
if(j == now){
row[now] = i;
nqueen(now + 1);
}
}
}
int main()
{
nqueen(0);
return 0;
}