文章参考了博客http://blog.csdn.net/hackbuteer1/article/details/6657109,该文对n皇后问题进行了详细的阐述,并给出了全部解问题的C的实现
仿照其实现,在此备份求单一解的Java程序。
public class Main {
static final int num = 2; //皇后数量
static final int non = -10000; //代表空棋盘
void Init(int n, int [] chessboard){ //棋盘的初始化
for (int i=0;i<n;i++){
chessboard[i] = non;
}
}//Init
boolean NoClash (int row, int col,int[] chessboard){ //判断皇后是否产生冲突,没有冲突返回true
for(int i=0;i<num;i++){
if(chessboard[i] == col|| Math.abs(i-row)==Math.abs(chessboard[i]-col)){
return false;
}
}
return true;
}//Clash
void print(int[] chessboard){
for(int i=0;i<num;i++){
System.out.print(chessboard[i]+" ");
}
}
public static void main(String[] args) {
int n = num;
int flag = 0; //flag 代表解的个数
int [] chessboard = new int[n];
Main m = new Main();
m.Init(n,chessboard);
int i=0,j=0; //i进行行扫描,j进行列扫描
while(i<n){
while(j<n){
if(m.NoClash(i, j, chessboard)){ //位置i,j可以放一个皇后
chessboard[i] = j; //在i行j列放一个皇后
j = 0; //下一行从第0列开始放置皇后
break;
}//if
else{
j++; //在j+1列进行尝试
}//else
}//while(j<n)
if(chessboard[i] == non){ //第i行没能找到解
if(i == 0) //i是第一行了,说明没有解了
break;
else{ //否则要进行回溯
i--; //上一行
j = chessboard[i]+1; //j从上一行的原位置+1开始搜索
chessboard[i] = non; //清空第i行棋盘
continue;
}//else
}//if
if(i==num -1){ //在最后的一行找到了位置,即找到了解
m.print(chessboard);
flag++;
break;
}//if
i++;
}//while(i<n)
if(flag == 0){
System.out.println("无解");
}
}//main
}