#include<stdio.h>
#include<math.h>
//考察皇后k放置在array[k]列是否发生冲突,数组下标从1开始算,因为数组第0个元素不可修改,原因略
//返回0表示冲突,返回1表示皇后K可以放在array[k]列
int
place(
int
* array,
int
k){
int
i;
for
(i=1;i<k;i++){
//判断是否同列或同一斜线
if
(array[k]==array[i]||
abs
(k-i)==
abs
(array[k]-array[i]))
return
0;
}
return
1;
}
void
main(){
int
n = 8;
int
* array = (
int
*)
malloc
((n+1)*
sizeof
(
int
));
int
i;
for
(i = 1;i<=n;i++)
array[i] = 0;
//初始化
int
k = 1;
//如果第1个皇后不能重新放,则程序结束,因为不能再向前回溯了
while
(k>=1){
array[k] = array[k]+1;
while
(array[k]<=n&&place(array,k)==0)
array[k] = array[k]+1;
if
(array[k]<=n&&k==n){
//得到一个摆放结果
for
(i = 1;i<=n;i++)
printf
(
"%d,"
,array[i]);
printf
(
"\n"
);
// return;//若返回则只输出一种结果,否则可以继续回溯,输出所有的结果
}
else
if
(array[k]<=n&&k<n)
k++;
//摆放下一个皇后
else
{
//回溯
array[k] = 0;
k--;
}
}
}
Java实现:
public class Test {
public static boolean isPlace(int[]array,int k){
for(int i = 0;i<k;i++){
if(array[i]==array[k]||(k-i)==Math.abs(array[k]-array[i]))
return false;
}
return true;
}
public static void main(String[] args){
int queen = 8;
int array[] = new int[queen];
int cur = 0;
while(cur>=0){
array[cur]++;
if(array[cur]>queen){
array[cur] = 0;
cur--;
continue;
}
if(isPlace(array, cur)){
if(cur<queen-1)
cur++;
else{
System.out.print("[");
for(int i = 0;i<queen-1;i++){
System.out.print(array[i]+",");
}
System.out.println(array[queen-1]+"]");
}
}
}
}
}