码迷,mamicode.com
首页 > 其他好文 > 详细

hdu 2553 n个皇冠问题

时间:2017-11-15 21:40:12      阅读:176      评论:0      收藏:0      [点我收藏+]

标签:输入   print   ati   java   esc   scan   sam   rgs   else   

Problem Description
在N*N的方格棋盘放置了N个皇后,使得它们不相互攻击(即任意2个皇后不允许处在同一排,同一列,也不允许处在与棋盘边框成45角的斜线上。
你的任务是,对于给定的N,求出有多少种合法的放置方法。

 

 

Input
共有若干行,每行一个正整数N≤10,表示棋盘和皇后的数量;如果N=0,表示结束。
 

 

Output
共有若干行,每行一个正整数,表示对应输入行的皇后的不同放置数量。
 

 

Sample Input
1
8
5
0
 

 

Sample Output
1
92
10
 
解题思路:假设有n个皇冠需要摆放,则从第1个皇冠到n个皇冠,每一个皇冠都有n个摆放位置,分别为第1-n列;从1个皇冠开始依次往后找到每一个皇冠位置后则递归求解下一个皇冠的摆放位置,若遇到皇冠在1-n列都没有其合适的位置,则返回上一层继续求解。
 
 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 }

 

hdu 2553 n个皇冠问题

标签:输入   print   ati   java   esc   scan   sam   rgs   else   

原文地址:http://www.cnblogs.com/xuzhiyuan/p/7840593.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!