标签:输入 print ati java esc scan sam rgs else
1 import java.util.Scanner; 2 3 public class Main{ 4 5 static int[] col; 6 static int[] res=new int[15];//存放每一个皇冠为n时,有多少种满足条件的 摆放方法 7 static int n;//n为皇冠的数量 8 static int sum;//sum用来累计皇冠个数一定时,有多少中不同的摆放方 9 10 public static void main(String[] args) { 11 12 Scanner input=new Scanner(System.in); 13 14 for(int i=1;i<=10;i++) { 15 16 col=new int[15]; 17 18 n=i;//n个皇冠 19 sum=0;//n个皇冠时有sum种摆放方法 20 dfs(1);//从第一个皇冠开始深度搜索求解 21 res[i]=sum; 22 23 } 24 25 while(input.hasNext()) { 26 27 n=input.nextInt(); 28 29 if(n==0) { 30 31 break; 32 33 } 34 35 System.out.println(res[n]); 36 37 } 38 39 } 40 41 //每次都是从第1个皇冠开始深度搜索求解 42 private static void dfs(int r) { 43 44 if(r>n) {//r>n说明前n个皇冠都找到了位置摆放, 45 46 sum++; 47 48 }else { 49 50 //从首个皇冠开始,每个皇冠有可以摆放n在不同的列,每个皇冠的摆放都是从第1列开始,直到第n列结束;若在n列中找到其合适的位置,则递归求解下一个皇冠的摆放位置 51 //若第r个皇冠在n列中没有找到其合适位置,则返回上一层求解, 52 for(int i=1;i<=n;i++) {//r表示第r个皇冠,也表示第r行,col[r]表示第r个皇冠摆放在第几列 53 54 col[r]=i; 55 if(place(r)) { 56 57 dfs(r+1); 58 59 } 60 61 } 62 63 } 64 65 } 66 67 //判断第i个元素是否可以放在col[i]这一列上 68 private static boolean place(int i) { 69 70 for(int k=1;k<i;k++) { 71 72 if(Math.abs(i-k)==Math.abs(col[i]-col[k])||col[i]==col[k]){ 73 74 //Math.abs(i-k)==Math.abs(col[i]-col[k])表示第i个皇冠与第k个皇冠在与棋盘变宽成45度角的斜线上 75 //col[i]==col[k]表示第i个皇冠与第k个皇冠在一列上 76 //i与k就是在不同的行上所以不用判断,i与k是否在同一个行上 77 return false; 78 79 } 80 } 81 return true; 82 } 83 }
标签:输入 print ati java esc scan sam rgs else
原文地址:http://www.cnblogs.com/xuzhiyuan/p/7840593.html