• ytu 1789:n皇后问题(水题,枚举)


     n皇后问题

    Time Limit: 1 Sec  Memory Limit: 64 MB  Special Judge
    Submit: 12  Solved: 3
    [Submit][Status][Web Board]

    Description

    在n×n 格的棋盘上放置彼此不受攻击的n 个皇后。按照国际象棋的规则,皇后可以攻击与之处在同一行或同一列或同一斜线上的棋子。n后问题等价于在n×n格的棋盘上放置n个皇后,任何2 个皇后不放在同一行或同一列或同一斜线上。 设计一个解n 后问题的队列式分支限界法,计算在n× n个方格上放置彼此不受攻击的n个皇后的一个放置方案。

    Input

    输入数据只占一行,有1 个正整数n,4≤n≤20。

    Output

    将计算出的彼此不受攻击的n个皇后的一个放置方案输出。第1行是n个皇后的放置方案。

    Sample Input

    5

    Sample Output

    1 3 5 2 4

    HINT

    N皇后问题
    解决这道问题有两种不同形式的做法:递归和迭代。

    递归和迭代有什么区别呢?
    现在引用百度知道的一个回答:

    简单来说,递归就是自己调用自己,如:
    int abc(...)
    {
    if(...) //递归终止条件
    { return abc(...); }
    return 0;
    }
    
    而迭代是重复一组指令,不断地根据变量的旧值推出新值,如:
    for(; ; ;) //迭代终止条件
    {
    a = b + c;
    b = a;
    c = a;
    }

    我想有一部分人也是分不清的吧,包括我自己也是,现在重温一下这两者的区别。
    ===================================
    好了,刚才只是题外话,现在我们回归正题。
    不管是递归还是迭代,实际上思路都是一样的。

    解题思路:
      题目要求任意一横排、一竖列、一斜线上不能有两个皇后,那么我们以行i做一个循环
    ,每循环一次就确定第i个皇后在第几列。很显然第i个皇后的位置不能和之前(i-1)个皇后的位置重复
    ,也就是a[i]!=a[1]/a[2]/.../a[i-1],那么写一个递归函数f(i),确定第i个皇后的位置。

    下面是我用递归做的代码:

     1 #include <iostream>
     2 
     3 using namespace std;
     4 int n;
     5 int a[100];
     6 bool f(int h)
     7 {
     8     if(h>n)
     9         return true;
    10     if(h==1){    //第一个皇后的位置不需要对比
    11         for(int i=1;i<=n;i++){
    12             a[h]=i;     13             if(f(h+1))
    14                 return true;
    15         }
    16     }
    17     else {  //从第二个皇后开始位置需要与前面的皇后对比了
    18         for(int i=1;i<=n;i++){  //按行循环
    19             int j;
    20             for(j=1;j<h;j++)  //判断是否一竖列有两个皇后
    21                 if(a[j]==i)
    22                     break;
    23             if(j<h)
    24                 continue;
    25             for(j=1;j<h;j++){  //判断是否一斜线上有两个皇后。因为是按行循环,所以不需要判断是否一横行上有两个皇后。
    26                 int t=h-j;
    27                 if(a[j]+t==i || a[j]-t==i)
    28                     break;
    29             }
    30             if(j<h)
    31                 continue;
    32             a[h]=i;
    33             if(f(h+1))  //判断下一个皇后的位置。
    34                 return true;
    35         }
    36     }
    37     return false;  //条件都不符合,则说明这种摆法不合适,回溯,换一种摆法。
    38 }
    39 
    40 int main()
    41 {
    42     cin>>n;
    43     f(1);
    44     for(int i=1;i<=n;i++)
    45         cout<<a[i]<<' ';
    46     return 0;
    47 }

    Freecode : www.cnblogs.com/yym2013

  • 相关阅读:
    (转)位置无关码、位置有关码
    【转载】PM为什么会存在?怎么存在?
    战略是什么?3-互联网产品行业以及竞争对手分析
    【转载】2014,要格外留意这7大投资机会——哈继铭 {key:人口红利、房价、社会结构、贸易逆差}
    2014年书单-30本
    产品经理要树立战略意识——战略是什么2(谈国家限制支付宝的战略分析)
    产品经理要树立战略意识——战略是什么1
    【转载】产品经理入门案例分析——锤子手机策略
    javascript设计模式-工厂模式
    javascript设计模式-单例模式
  • 原文地址:https://www.cnblogs.com/yym2013/p/3473797.html
Copyright © 2020-2023  润新知