描述
在 n*n 的国际象棋棋盘上放置n个皇后,使得任何一个皇后都无法直接吃掉其他的皇后(任两个皇后都不能处于同一条横行、纵行或斜线上)
输入
输入有多组(直到-1结束)
每组一行 一个整数 n(0<n<11)代表皇后的个数。
输出
每组测试数据间输出一个换行。
对于每组数据,如果存在一个棋谱(使得n个皇后不会相互攻击),先输出这是第几种棋谱,然后输出该棋谱。当全部棋谱都输完时,最后输出该组总共摆放的棋谱数。
答案方面本地运行是问题的,就是想知道如何减少内存消耗 import java.util.Scanner;// class main { int[] eq=new int[11];//下标表示行,对应的值表示列 static int count=0; public static void main(String[] args){ main solution=new main(); Scanner myscanner=new Scanner(System.in); int flag=0; while(myscanner.hasNext()){ int times=myscanner.nextInt(); if(times==-1) break; if(flag!=0) System.out.println(); solution.findways(times,0); System.out.println("There are "+count+" kinds of"); count=0; flag++; } } public boolean judge(int line){//遍历列数,行与行的差和列与列的差相等说明在同一条对角线 for(int i=0;i<line;i++){ if(eq[i]==eq[line] || Math.abs(line-i)==Math.abs(eq[i]-eq[line])){ return false; } } return true; } public void print(int times,int[] map){ int n=0; count++; System.out.println("case"+count+":"); for(int i=0;i<times;i++){ int flag=0; for(int j=0;j<times;j++){ if(i==n&&j==map[n]){ if(flag!=0) System.out.print(" "); System.out.print("1"); } else{ if(flag!=0) System.out.print(" "); System.out.print("0"); } flag++; } System.out.println(); n++; } } public void findways(int n,int line){ if(n==line){ print(n,eq); } else{ for(int i=0;i<n;i++){ eq[line]=i; if(judge(line)){ findways(n,line+1); } } } } }