王、后问题

问题描述
  地球人都知道,在国际象棋中,后如同太阳,光芒四射,威风八面,它能控制横、坚、斜线位置。
  看过清宫戏的中国人都知道,后宫乃步步惊心的险恶之地。各皇后都有自己的势力范围,但也总能找到相安无事的办法。
  所有中国人都知道,皇权神圣,伴君如伴虎,触龙颜者死......
  现在有一个n*n的皇宫,国王占据他所在位置及周围的共9个格子,这些格子皇后不能使用(如果国王在王宫的边上,占用的格子可能不到9个)。当然,皇后也不会攻击国王。
  现在知道了国王的位置(x,y)(国王位于第x行第y列,x,y的起始行和列为1),请问,有多少种方案放置n个皇后,使她们不能互相攻击。
输入格式
  一行,三个整数,皇宫的规模及表示国王的位置
输出格式
  一个整数,表示放置n个皇后的方案数
样例输入
8 2 2
样例输出
10
数据规模和约定
  n<=12

  解答思路:从第一行开始放,然后检索这个位置是不是可以放皇后,判断这个位置是不是有皇上,再看看与他直接相连的是不是已经有了皇后   

  如果没有则可以放上皇后  

如果检索完一次的话就可以加1 输出结果

 1 #include <iostream>
 2 using namespace std;
 3 int c[13][13];
 4 int n;
 5 int count=0;
 6        int judge(int row, int col)  //判断是否有皇后在一条直线上
 7 {  
 8     int i,j;  
 9    for(i = row-1, j = col-1; i >= 1 && j >= 1; i --, j --){  
10         if(c[i][j] == 1){  
11             return 0;  
12         }  
13     }  
14     for(i = row-1, j = col+1; i >= 1 && j <= n; i --, j ++){  
15         if(c[i][j] == 1){  
16             return 0;  
17         }  
18     }  
19     for(i = row-1, j = col; i >= 1; i --){  
20         if(c[i][j] == 1){  
21             return 0;  
22         }  
23     }  
24     /*  for(m=1;m<=n;m++)
25       {
26           if(c[m][j]==1&&m!=i)
27       {
28               return 0;
29       }
30       }
31       for(o=1;o<=n;o++)
32       {
33           if(c[i][o]==1&&o!=n)
34           {
35               return 0;
36           }
37       }*/
38     return 1;  
39 }                                                                                                                   
40 
41 void dfs(int i)
42 {
43     if(i>n)
44     {
45         count++;
46     }
47     else{
48         for(int j=1;j<=n;j++)
49         {
50             if(c[i][j]==2)continue;//判断是不是有皇上
51             if(judge(i,j))
52             {
53                 c[i][j]=1;
54                 dfs(i+1);
55                 c[i][j]=0;
56             }    else continue;
57         }    
58     }
59 }
60 int main()
61 {
62 
63     int x,y;
64     cin>>n;
65     cin>>x;
66     cin>>y;
67     for(int i=x-1;i<=x+1;i++)
68     {
69         for(int j=y-1;j<=y+1;j++)
70         {
71             c[i][j]=2;
72         }
73     }
74     dfs(1);
75     cout<<count;
76 }
原文地址:https://www.cnblogs.com/jweie/p/8371722.html