回溯——n皇后问题

来源:互联网 发布:绿联hdmi网络传输器 编辑:程序博客网 时间:2024/06/05 04:34

问题描述:

在一个n*n的棋盘上放上n个皇后棋子,要求每个皇后之间不位于同一行、同一列、同一对角线;

思路:

我们知道每一行都存在一个皇后,用一个数组col[i]来存放第i行皇后的位置,这样就保证了皇后不会出现在在同一行上,要检查同一行,只需检查两个皇后对应的col是否相等;检查同一对角线,他们行数之差的绝对值等于列数之差的绝对值;

按行的顺序来找皇后的位置,依次考察一行中每列位置是否与之前的皇后构成威胁,若否则跳过,若是则进行下一行的考察;

代码实现:

import java.util.Scanner;//没有考虑棋盘对称的情况public class NQueens {int n,i=1;int[] col;//从第i个皇后开始放置NQueens(){System.out.print("请输入皇后数目");Scanner scan=new Scanner(System.in);n=scan.nextInt();col=new int[n+1];}//先确定每一行都有一个皇后,现在只需要确认每行的皇后在哪一行void queens(int i){if(promise(i)){if(i==n){printQueens();System.out.println();}elsefor(int j=1;j<=n;j++){col[i+1]=j;queens(i+1);}}}//用来判断第i行的queen是否受到其他皇后的威胁boolean promise(int i){int k=1;boolean flag=true;while(k<i&&flag){if(col[k]==col[i]||Math.abs(k-i)==Math.abs(col[k]-col[i]))//不同行的皇后,不能再同一行或同一对角线出现flag=false;k++;}return flag;}//打印皇后坐标void printQueens(){System.out.println("第"+i+++"种情况");for(int i=1;i<=n;i++)System.out.println("("+i+","+col[i]+")");}public static void main(String[] args){NQueens queens=new NQueens();queens.queens(0);}}


原创粉丝点击