zoukankan      html  css  js  c++  java
  • 王、后问题

    问题描述
      地球人都知道,在国际象棋中,后如同太阳,光芒四射,威风八面,它能控制横、坚、斜线位置。
      看过清宫戏的中国人都知道,后宫乃步步惊心的险恶之地。各皇后都有自己的势力范围,但也总能找到相安无事的办法。
      所有中国人都知道,皇权神圣,伴君如伴虎,触龙颜者死......
      现在有一个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 }
  • 相关阅读:
    Git failed with a fatal error. Authentication failed
    HttpClient 获取json,即使返回状态不成功也返回json
    win10恢复Windows Media Player
    .NET Core部署到linux(CentOS)最全解决方案
    EasyNetQ 相关问题和解决方法
    RabbitMQ And EasyNetQ
    打爆你的 CPU
    通过代码实现 OutOfMemory
    如何写一段死锁代码
    docker 容器(container)使用ssh服务登录一段时间无操作后自动断开问题解决
  • 原文地址:https://www.cnblogs.com/jweie/p/8371722.html
Copyright © 2011-2022 走看看