public class 八皇后 { //棋盘全是 。。。。。 放皇后的位置 Q static ArrayList<String> s=new ArrayList<>(); // 初始化一个数组全部放 . public static void main(String[] args) { Scanner sc=new Scanner(System.in); int n=sc.nextInt(); //初始化棋盘 char a[][]=new char[n][n]; for (int i = 0; i < n; i++) { for (int j = 0; j < n; j++) { a[i][j]='.'; } } //进入函数求解 f(a,0,n); for (int i = 1; i <= s.size(); i++) { System.out.println(s.get(i-1)); if(i%n==0) System.out.println("~~~~~~~~~~~~~"); } System.out.println(s.size()); } //传棋盘个数方便处理 public static void f(char[][] a,int h,int nn){ //h 从0开始 所以等于4 就是已经都放置了皇后 记录结果 if(h==nn){ for (int i = 0; i < a.length; i++) { char b[]=new char[a[i].length]; for (int j = 0; j < a[i].length; j++) { b[j]=a[i][j]; } String s3=String.valueOf(b);//将字符数组转换成字符串 s.add(s3);//将字符串添加到ArrayList里 } return; } //列的所有可能性 一行只能有一个 所以每次行改变 遍历列 for (int l = 0; l < nn; l++) { //排除不可行的坐标 if(f1(a,h,l,nn)==false) continue; //可行方案赋值 a[h][l]='Q'; //进入下一行 f(a,h+1,nn); //撤销当前选择 进入下一行返回说明到底 // 或者下一行没有位置可行 说明这个坐标有误 a[h][l]='.'; } } private static boolean f1(char[][] a, int h,int l,int nn) { //排除列有皇后 for (int i = 0; i < nn; i++) { if(a[i][l]=='Q'){ return false; } } //排除右上有皇后 for (int i =h-1 ,j=l+1;i>=0&&j<nn ;i--,j++ ) { if(a[i][j]=='Q') return false; } //排除左上 for (int i =h-1 ,j=l-1;i>=0&&j>=0 ;i--,j-- ) { if(a[i][j]=='Q') return false; } return true; } }
八皇后棋盘
最新推荐文章于 2025-05-11 14:15:46 发布