成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

全排列的應用:正方體的組成與八皇后

開發 前端
初次看到這個問題,很多開發者可能會比較蒙,一時間無法找到切入點。那我們就先畫個正方體出來,給每個頂點標記a1, a2 ,a3 ,...., a8。

前言

給定一個含有8個數字的數組,判斷有沒有可能把這8個數字分別放到正方體的8個頂點上,使得正方體上三組相對面上的4個頂點的和都相等。

本文就跟大家分享下這個問題的解決方案,歡迎各位感興趣的開發者閱讀本文。

正方體的組成

初次看到這個問題,很多開發者可能會比較蒙,一時間無法找到切入點。那我們就先畫個正方體出來,給每個頂點標記a1, a2 ,a3 ,...., a8。如下圖所示:

圖片

iShot_2023-06-26_07.36.45

實現思路

有了圖之后,我們在做進一步的分析,這個正方體有6個面,3組相對的面(上下、前后、左右):

  • a1, a2, a4, a3 | a5, a6, a8, a7
  • a1, a5, a6, a2 | a3, a4, a8, a7
  • a1, a3, a7, a5 | a2, a4, a8, a6

有了這些條件后,再次結合題意,我們可知:只需要將8個數字分別放入正方體的8個頂點中,判斷三組相對面的頂點和是否都相等,這個問題就解決了。

8個數字分別放到8個頂點上,所有數字都有可能放入任意一個頂點。換言之就是求這8個數字的所有排列,我的另一篇文章實現字符串的排列算法詳細講解了這個算法的實現思路,此處不過多贅述。

分析到這里,我們就得出了一個完整的實現思路:

  • 求出給定數組中8個數字的所有排列
  • 遍歷所有排列,將每個排列中的元素映射到變量中(a1, a2, ..., a8)
  • 判斷8個點組成的三組相對面的頂點和是否相等

實現代碼

分析出思路后,我們就可以將上述思路轉換成代碼了,如下所示:

/**
   * 能否構成正方體
   * @param nums
   */
  public isCubePossible(nums: Array<number>): boolean {
    if (nums.length !== 8) {
      return false;
    }
    // 獲取8個點的所有排列
    const list = this.permute(nums.join(""));
    for (let i = 0; i < list.length; i++) {
      // 將當前組合中的點轉為number類型放入item
      const item: Array<number> = [];
      for (let j = 0; j < list[i].length; j++) {
        item.push(+list[i][j]);
      }
      // 從當前組合中獲取正方體的8個點
      const [a1, a2, a3, a4, a5, a6, a7, a8] = item;
      // 判斷正方體三組相對面上的點相加是否相等
      if (
        a1 + a2 + a4 + a3 === a5 + a6 + a8 + a7 &&
        a1 + a5 + a6 + a2 === a3 + a4 + a8 + a7 &&
        a1 + a3 + a7 + a5 === a2 + a4 + a8 + a6
      ) {
        return true;
      }
    }
    return false;
  }

上述代碼中沒有列舉permute方法的具體實現,對此感興趣的開發者請移步:ArrayOfStrings.ts

八皇后問題

在一個8*8的棋盤上放置八個皇后,使得它們彼此之間不會互相攻擊(即不在同一行、同一列或同一對角線上),總共有多少種擺法?如下圖所示列舉了其中一種擺法:

圖片

iShot_2023-06-26_11.40.41

實現思路

分析題目后 ,我們知道了兩個皇后不能處在同一行,那么肯定是每個皇后獨占一行。那我們就先把皇后定義出來,用一個數組來表示皇后在棋盤上的列號,分別用0~7(棋盤上有8個皇后)對這個數組進行初始化。

棋盤上每一行所放置的皇后,它都可以放在這一行的任意位置。很顯然,這也需要用到全排列求出它的所有放置組合。因為我們用的不同數字對數組進行的初始化,所以任意兩個皇后肯定不同列。

因此,我們只需要判斷每一組排列對應的8個皇后是不是在同一條對角線上,即:對于數組的兩個下標i和j,是否有i-j === queens[i] - queens[j] || j-i === queens[j] - queens[i],這個問題就得到了解決。

我們來寫一下實現思路:

  • 定義皇后數組,分別用0~7對這個數組進行初始化
  • 求出這個數組的所有排列
  • 遍歷所有排列,判斷每一個排列是否滿足不在同一對角線的條件
  • 遍歷滿足條件的排列,對棋盤進行填充(將皇后放置在棋盤上)

實現代碼

我們將上述思路轉換為代碼,如下所示:

public eightQueens(): Array<Array<Array<number>>> {
    const queens = [0, 1, 2, 3, 4, 5, 6, 7];
    const solutions: Array<Array<Array<number>>> = [];
    // 獲取所有組合
    const list = this.permute(queens.join(""));
    for (let i = 0; i < list.length; i++) {
      // 求出的組合中元素值為string類型的,這里需要將其轉為number類型
      const item: Array<number> = [];
      for (let j = 0; j < list[i].length; j++) {
        item.push(+list[i][j]);
      }
      // 不在對角線上
      if (this.isValidPlacement(item)) {
        const solution: Array<Array<number>> = [];
        // 遍歷此組合,取出皇后的擺放位置
        for (let j = 0; j < item.length; j++) {
          const col = item[j];
          const row: Array<number> = Array(8).fill(0);
          row[col] = 1;
          solution.push(row);
        }
        solutions.push(solution);
      }
    }
    return solutions;
  }
  
   /**
   * 判斷當前組合是否滿足排列要求(不在對角線上)
   * @param queens
   * @private
   */
  private isValidPlacement(queens: Array<number>) {
    for (let i = 0; i < queens.length; i++) {
      for (let j = i + 1; j < queens.length; j++) {
        if (Math.abs(queens[i] - queens[j]) === Math.abs(i - j)) {
          // 在對角線上
          return false;
        }
      }
    }
    return true;
  }

測試用例

我們用一個例子來校驗下上述代碼能否正常執行。

const arrayOfStrings = new ArrayOfStrings();
console.log(
  "能否構成正方體",
  arrayOfStrings.isCubePossible([1, 2, 3, 4, 5, 6, 7, 8])
);
console.log("八皇后問題有", arrayOfStrings.eightQueens().length, "種擺法");

圖片

圖片

示例代碼

本文用到的代碼完整版請移步:

  • ArrayOfStrings.ts
  • ArrayOfStrings-test.ts
責任編輯:武曉燕 來源: 神奇的程序員
相關推薦

2021-04-23 21:03:10

MySQL數據語法

2021-11-19 07:54:40

前端

2009-08-11 09:16:00

2023-05-31 12:01:22

2010-06-17 16:14:33

UML總結

2009-08-13 14:24:44

C#結構體構造函數

2013-04-02 10:37:53

2011-04-29 13:49:47

一體機

2021-04-20 09:00:48

Go 語言結構體type

2020-09-24 10:15:37

智能

2025-06-12 08:08:00

自主式AIRPA自動化

2022-08-01 06:22:38

人工智能AI

2017-03-13 19:46:08

閃存存儲SSD

2017-03-08 14:36:17

全閃存混合存儲

2011-03-18 10:06:48

LAMP組成

2009-02-18 10:22:00

IP地址網段

2013-01-10 09:29:13

WLANQos

2018-04-09 12:44:45

Docker使用場景開發

2010-03-12 16:14:17

Pythonexe

2015-01-06 09:48:34

Docker多租戶docker應用
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 国产欧美一区二区三区在线看 | 欧美亚州综合 | 成人久久久 | 亚洲va欧美va天堂v国产综合 | 一区二区三区国产好 | 99久久久国产精品免费消防器 | 精品久久久久久久久久久 | 国产一区2区| 日韩电影免费在线观看中文字幕 | 久久9久| 毛片久久久 | 一级片免费视频 | 久久av一区二区三区 | 国产高清亚洲 | a在线视频| 久久久久久国产精品免费 | 欧美男人的天堂 | 99综合网 | 亚洲国产aⅴ成人精品无吗 国产精品永久在线观看 | 久久久女女女女999久久 | 91精品国产综合久久久动漫日韩 | 亚洲精品久久久久中文字幕欢迎你 | 国产精品五月天 | 欧美电影一区 | 国产精品伦一区二区三级视频 | 一级a爱片性色毛片免费 | 97日日碰人人模人人澡分享吧 | 性一交一乱一透一a级 | 好姑娘影视在线观看高清 | 国产精品三级久久久久久电影 | 欧美又大粗又爽又黄大片视频 | 国产激情网站 | 国产乱码精品1区2区3区 | 国产成人午夜高潮毛片 | 男人av在线| 久久国产精品偷 | 99re在线| 亚洲视频免费在线观看 | 香蕉久久网 | 欧美激情在线观看一区二区三区 | 欧美区日韩区 |