HIT ACM 2009 Summer Contest 03  A : (八皇后问题)解题报告
-----------------------------------------------------------------
题目大意:给定一个 size * size (size作为输入)的棋盘,要求在棋盘上放size个棋子,要求每一行、每一列以及每一斜行只能有一个棋子,要求输出这样放能有多少种放法以及第一种放法;

分析:题目的关键 就在于确定某个位置是不是可以放一个棋子,而只有在该位置的同一行、同一列以及两个斜行都没有其他棋子时这个位置就是合法的,因为每一行只有一个棋子,所以不需要一个 size * size 的数组来存结果,只需 pos[] 来存就行, pos[j] = i 就表示在第j行 第i列处有一个棋子,而这样就可以保证每一行只有一个棋子了,所以在检查的时候就不需要检查行了,检查列也可以用一个数组 col[] 标记,当col[i] = 1 时证明第i列已有棋子;而对于斜行:

如下图,给各个斜行标号(一 size = 5 为例):

主对角:
                 
            5 4 3 2 1
            6 5 4 3 2
            7 6 5 4 3
            8 7 6 5 4
            9 8 7 6 5    则可以发现规律:主对角方向上的 斜行 上的位置有:num 为斜行的编号 则: num = size - ( row - column )
                         那么现在又只需要一个一维数组来标记主对角方向的斜行; dia[]

反对角:    1 2 3 4 5
            2 3 4 5 6
            3 4 5 6 7
            4 5 6 7 8
            5 6 7 8 9   则同样可以发现规律: num = row + column - 1  同样一个一维数组可以满足要求;bdia[]

这样,一个位置合法的条件就出来了  位置为 ( r,c )   即: col[c] == 0 && dia[size - (r - c)] == 0 && bdia[r + c - 1] == 0
可以写一个函数 legal() 来检查:

int legal(int r,int c)
{
    if (col[c] == 1)
        return 0;
    if (dia[size - (r - c)] == 1)
        return 0;
    if (bdia[r + c -1] == 1)
        return 0;
    return 1;
}

------------------
这样知道位置是否是合法的后,就好办了:
         从第一行开始每行进行 深搜, 找合法的位置,如果找到 标记 (注意:三个数组都要标记),就从递归调用从下一行继续开始深搜:

void DFS(int c)
{
    int i;
    for (i = 1;i <= n;i++)
    {
        if (legal(i,c))
        {
            ocp(i,c);  //标记这个位置
            if (c < n)
                DFS(c+1);  //递归调用
            else
            {
                count++;
                display();  //显示结果
            }
            unocp(i,c);  //释放这个位置
        }
    }
}
-------------------------
这样这个问题就解决了…………
--------------------------------------------------------
思考:自己写好了交上去以后, 一个 TLE 让我无语, 后来由于在比赛中,  呵呵  数据 比较小  1 =< size <= 13   所以  我就把 13  打表过了   鄙视自己一下…………

下来后, 落花神牛 讲了一个优化的方法: 考虑棋盘的对称性  即: 如果 第一行的 第 i 个位置有一颗棋子  那么在第一行的倒数第i个位置有一颗棋子同样对应了另一组解……  呵呵  没想到啊
   那么考虑 size = 2 * k - 1   即奇数的时候   对第一行的列进行搜索,对以后每一行的每个位置搜索,而第一行只需搜到最中间一列的前一列为止,记解数为 T ,在单独考虑 第一行中间有一颗棋子的情况,注意,棋盘也是上下对称的  所以 在棋盘最后一行如果中间有棋子的话,记录 次情况下的解数 B ,则总的结果即为 2 * T + B;
   当size为偶数时就更简单了:即为 2 * T ;
很巧啊,减少了一半的搜索量……
----------------------------------------------------------------------
    from : Debug cool     
           7.25

八皇后问题。。。。。。相关推荐

  1. C语言局部搜索算法(爬山法,模拟退火法,遗传算法)求解八皇后问题

    C语言局部算法求解八皇后问题 写在前面 八皇后问题及局部搜索算法 爬山法(hill-climbing searching) 算法介绍 代码实现 退火法(simulated annealing) 算法介 ...

  2. 递归/回溯:八皇后问题N-Queens

    N皇后问题是计算机科学中最为经典的问题之一,该问题可追溯到1848年,由国 际西洋棋棋手马克斯·贝瑟尔于提出了8皇后问题. 将N个皇后放摆放在N*N的棋盘中,互相不可攻击,有多少种摆放方式,每种摆 放 ...

  3. 八皇后的一个回溯递归解法

    解法来自严蔚敏的数据结构与算法. 代码如下: #include <iostream> using namespace std; const int N = 8;//皇后数 int coun ...

  4. Prolog学习:数独和八皇后问题

    上一篇简单介绍了下Prolog的一些基本概念,今天我们来利用这些基本概念解决两个问题:数独和八皇后问题. 数独 数独是一个很经典的游戏: 玩家需要根据n×n盘面上的已知数字,推理出所有剩余空格的数字, ...

  5. 带你轻而易举的学习python——八皇后问题

    首先我们来看一下这个著名的八皇后问题 八皇后问题:在8×8格的国际象棋上摆放八个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行.同一列或同一斜线上,问有多少种摆法. 在这个问题提出之后人们又将 ...

  6. 漫画:什么是八皇后问题?

    本文经授权转载自公众号程序员小灰 (ID:chengxuyuanxiaohui) -----  第二天  ----- 题目是什么意思呢? 国际象棋中的皇后,可以横向.纵向.斜向移动.如何在一个8X8的 ...

  7. 递归解决八皇后问题-小昝

    引言 由于大学课堂中数据结构中并没有讲一些常见的算法,只是讲的比较简单的定义.所以拿出来暑假时间去研究经典的算法.本文章是研究的八皇后问题.八皇后问题是一个以国际象棋为背景的问题:如何能够在 8×8 ...

  8. 十二、八皇后问题(递归回溯)

    一.八皇后问题介绍 (本次使用回溯算法解决,之后会用贪心算法优化) 在 8×8 格的国际象棋上摆放八个皇后,使其不能互相攻击,即:任意两个皇后都不能处于同一行. 同一列或同一斜线上,问有多少种摆法(9 ...

  9. Scheme来实现八皇后问题(2)

    版权申明:本文为博主窗户(Colin Cai)原创,欢迎转帖.如要转贴,必须注明原文网址http://www.cnblogs.com/Colin-Cai/p/9790466.html 作者:窗户QQ/ ...

  10. 八皇后算法python_Python学习二(生成器和八皇后算法)

    看书看到迭代器和生成器了,一般的使用是没什么问题的,不过很多时候并不能用的很习惯 书中例举了经典的八皇后问题,作为一个程序员怎么能够放过做题的机会呢,于是乎先自己来一遍,于是有了下面这个ugly的代码 ...

最新文章

  1. window 获取进程运行长
  2. Java基础与提高干货系列——Java反射机制
  3. [LeetCode]Single Number II
  4. golang 结构体 slice 排序
  5. spring是如何管理 事务的
  6. qtreewidgetitem 文字内存太长换行_table文字溢出显示省略号问题
  7. javascript:使用canvas绘图2D图形
  8. 如何安装mysql 5.6_如何安装MySQL 5.6?
  9. SQL语句导致性能问题
  10. 力扣-64 最小路径和
  11. 7-8 mmh学长的Excel表格 (20分)
  12. Linux(Ubuntu14.04)下Google Chrome / Chromium标题栏乱码问题
  13. 顺序不能改变的算子,是否跟时间有关
  14. 高仿iOS微信客户端
  15. 第1章 Android编程入门
  16. 大数据智能推荐系统原理介绍
  17. win10开启移动热点,手机无法获取ip地址
  18. 南方都市报:红心照耀MSN
  19. 单核CPU的并发和并行(操作系统篇)
  20. 这是广告clearview ai用来将您的脸卖给警察的广告

热门文章

  1. 工作中常用的前端知识总结
  2. NBMiner_42.2内核震撼发布下载,nvidia30LHR版本显卡全系解锁100%
  3. Android 使用 ksoap2-android调用Web Service学习
  4. MySQL语句面试(二)
  5. 四面阿里,因为最后一个问题与offer失之交臂
  6. 基于51单片机的指纹解锁自动开门
  7. 浏览器中的data类型的Url格式,data:image/png,data:image/jpeg!
  8. 积木报表JimuReport跟ureport2对比
  9. 光纤中的多种光学模式芯径_光纤激光器的重要参数BPP(M2)
  10. 一阶二阶多智能体一致性控制的Matlab程序