浏览器标题切换
浏览器标题切换end

HDU-2553 -N皇后问题-dfs

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

Input
共有若干行,每行一个正整数N≤10,表示棋盘和皇后的数量;如果N=0,表示结束。
Output
共有若干行,每行一个正整数,表示对应输入行的皇后的不同放置数量。
Sample Input
1 8 5 0

Sample Output 1 92 10

 

题意:求出n*n里面放置棋子的情况,使得每个棋子所在行、列、对角线没有其它棋子

 

思路:

  直接看代码吧,代码注释比较好懂。

 

 1 #include<stdio.h>
 2 #include<string.h>
 3 #include<iostream>
 4 #include<cmath>
 5 using namespace std;
 6 
 7 int ans[11];
 8 int a[11];
 9 int sum,n;
10 
11 int judge(int x)
12 {
13     for(int i=1; i<x; i++) //判断之前和走过的行是否有重复
14     {
15         int dd1=abs(i-x);
16         int dd2=abs(a[i]-a[x]);
17         if(a[i]==a[x]||(dd1==dd2))
18         {
19             return 1;
20         }
21     }
22     return 0;
23     //对角线出现过即k=-1或1
24     //即斜率的绝对值=1
25     //即两者的横纵坐标对应相减后绝对值相等
26 }
27 void dfs(int x)//传入行
28 {
29     //cout<<x<<"&&&&&&&&&&&&";
30     if(x>n) // if(x==n+1)
31     {
32         sum++;
33         return ;
34     }
35 
36     for(int j=1; j<=n; j++) //决定下在哪一列
37     {
38         a[x]=j;//下上去
39         //cout<<judge(x)<<"*****"<<endl;
40         if(judge(x)==1)//说明出现过了
41             continue;
42         //    return;
43         else
44         {
45             dfs(x+1);
46         }
47     }
48     return ;
49 }
50 
51 int main()
52 {
53     std::ios::sync_with_stdio(false);
54     cin.tie(0);
55     cout.tie(0);
56     memset(ans,0,sizeof(ans));
57     for(int i=1; i<=10; i++)
58     {
59         n=i;
60         sum=0;
61         dfs(1);
62         ans[i]=sum;
63     }
64     while(cin>>n)
65     {
66         if(n==0)
67             break;
68         cout<<ans[n]<<endl;
69     }
70     return 0;
71 }

 

posted @ 2019-09-06 14:05  抓水母的派大星  阅读(99)  评论(0编辑  收藏  举报