N皇后问题
2017-02-16 17:53
246 查看
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 { static int N; static int[] position; //用来存放算好的皇后位置。最左上角是(0,0) public static void NQueen(int k){ //在0~k-1行皇后已经摆好的情况下,摆第k行及其后的皇后 if ( k == N){ // N 个皇后已经摆好 System.out.print(position[0]+1); for ( int i = 1 ; i < N ; i++){ System.out.print(" "+(position[i]+1)); } System.out.println(); }else{ for ( int i = 0 ; i < N ; i++){ //逐尝试第k个皇后的位置 int j; for( j = 0 ; j < k ; j++){ //和已经摆好的 k 个皇后的位置比较,看是否冲突 if ( position[j] == i || Math.abs(position[j]-i) == Math.abs(k-j)){ break;//冲突,则试下一个位置 } }if ( j == k){ //当前选的位置 i 不冲突 position[j] = i;//将第k个皇后摆放在位置 i NQueen(k+1); } } } } public static void main(String[] args) { // TODO Auto-generated method stub Scanner in = new Scanner(System.in); N = in.nextInt(); position = new int ; NQueen(0);//从第0行开始摆皇后 in.close(); } }