用递归替代多重循环
n皇后问题:输入整数n, 要求n个国际象棋的皇后,摆在
n*n的棋盘上,互相不能攻击,输出全部方案。
输入一个正整数N,则程序输出N皇后问题的全部摆法。
输出结果里的每一行都代表一种摆法。行里的第i个数字如
果是n,就代表第i行的皇后应该放在第n列。
皇后的行、列编号都是从1开始算。
样例输入:
4
样例输出:
2 4 1 3
3 1 4 2
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner reader=new Scanner(System.in);
int n=reader.nextInt();
int[] queenPos=new int[n];//java没有全局变量,只能多传几个值
queen(n,0,queenPos);//从第0行开始摆放棋子
}
public static void queen(int n,int k,int[] queenPos){
//摆第k行的棋子前提是0-k-1行的棋子已经摆好
if (k==n){//0-n-1行的棋子已经摆好
for (int i=0;i<n;i++){
System.out.print(queenPos[i]+1+" ");
}
System.out.println();
return;
}
int j;
for (int i=0;i<n;i++){//i列
for (j=0;j<k;j++){//j行,从第0行开始遍历,看是否符合条件摆放棋子
//现第k行第i列,比较第j行第queenPos[j]列
if (Math.abs(queenPos[j]-i)==Math.abs(j-k)||j==k||queenPos[j]==i){
break;//不符合条件摆放棋子
}
}
if (j==k){//可以摆放
queenPos[k]=i;//第k行摆在第i列
queen(n,k+1,queenPos);
}
}
}
}