这个主题用于把算法分析与设计课程的每周郭老,上课后的精讲例题的实现与复习。
问题描述:
l
N
皇后问题:
N*N
棋盘上,
N
个皇后不能在同行,同列及同一个对角线上。
编程实现:
#include <stdlib.h>
#include <iostream>
#include <stdio.h>
#include <math.h>
using namespace std;
bool canPlace(int x[],int N,int k){
for(int i=1;i<k;i++){
// 判断是否在对角线上
if( abs(x[i]-x[k]) == abs(i-k) ) {
return false;
}
//判断是否同一列
if(x[i] == x[k]){
return false;
}
}
return true;
}
int main(){
int N; //Number of Queens
cin>>N;
int x[20];
x[1] = 0;
int k=1;
int L=0;
while(k > 0){
x[k] = x[k] + 1; //取当前列的下一列
while(x[k] <= N && !canPlace(x,N,k)){
x[k] = x[k] + 1;
}
if(x[k] <= N){
if(k == N){
cout<<"No."<<L++<<endl;
for(int i=1;i<=N;i++){
printf("x[%d]:%d \n", i,x[i]);
}
cout<<endl;
}
else {
k++;
x[k] = 0;
}
}
else{
k = k-1;
}
}
cout<<"End "<<endl;
system("pause");
return 0;
}