zoukankan      html  css  js  c++  java
  • N皇后问题另类解法,将棋盘问题转换为数字排列问题

    N皇后问题另类解法

    琐事包围的一年,很久没写blog啦,最近练习leetcode刚好遇到N皇后问题,以前都是直接模拟棋盘来进行搜索,这次想到一个新思路。

    以5皇后问题为例来分析:

    1. 首先抽象棋盘为二维数组:

      00000
      00000
      00000
      00000
      00000

    2. 皇后置放位置不同行不同列:
      00001 -> 1
      00010 -> 2
      00100 -> 4
      01000 -> 8
      10000 -> 16

      由此可以将棋盘的每一行看作一个5位的二进制数,将问题转化为数字的排列组合问题。
      N皇后问题就是 1、2、4、8、16...(2的N次方) 这N个数的排列问题。

    3. 皇后置放位置斜方向有且只有一个:
      成立的排列:
      00001 -> 1
      01000 -> 8
      00010 -> 2
      10000 -> 16
      00100 -> 4

      不成立的排列:
      00001 -> 1
      00100 -> 4
      00010 -> 2
      10000 -> 16
      01000 -> 8

      有了第二步作为基础,通过找规律可以得到一个规律:
      假设存在数组q[0],q[1]...q[k]...q[n],
      取数字N放在位置k有一个通用的约束条件:如果存在一个p位置的数,使得q[k]除以q[p]或者q[p]除以q[k]恰好等于2的(abs(p-k))次方,那么数字N放置在位置k不成立。

  • 相关阅读:
    linux安装软件的几种方式
    linux目录
    linux远程连接
    linux分区
    linux特殊符号
    sed
    rest_framework认证流程
    一些面试题目
    算法之二分法
    算法之动态规划
  • 原文地址:https://www.cnblogs.com/devin_zhou/p/14101526.html
Copyright © 2011-2022 走看看