制作一个上面有两个皇后的棋盘[重复]

Posted

技术标签:

【中文标题】制作一个上面有两个皇后的棋盘[重复]【英文标题】:Making a chessboard with two queens on it [duplicate] 【发布时间】:2020-01-10 05:58:33 【问题描述】:

我希望在我的终端中制作一个 8 x 8 棋盘。我已经制作了正确的 8 x 8 网格,但现在无法将两个皇后添加为 1

我一直在尝试,正如您在代码 arrayz[0][1] = 1 中看到的那样。我想知道问题是否与我的循环有关,或者有一种简单的方法可以将两个循环插入问题中。

const generateBoard= function()

  let arrayz = []
  let set= []
  let newArray = []


  for (i = 0; i < 8; i++)

      newArray.push(0)
   
  for (y = 0; y < 8; y++)
      //newArray[0][1] = 1
      arrayz.push(newArray)  
      arrayz[0][1] = 1 //my failed code that im trying to use to input a single one

    
  return arrayz
  

console.log(generateBoard(whiteQueen, blackQueen))



[ [ 0, 1, 0, 0, 0, 0, 0, 0 ],
  [ 0, 1, 0, 0, 0, 0, 0, 0 ],
  [ 0, 1, 0, 0, 0, 0, 0, 0 ],
  [ 0, 1, 0, 0, 0, 0, 0, 0 ],
  [ 0, 1, 0, 0, 0, 0, 0, 0 ],
  [ 0, 1, 0, 0, 0, 0, 0, 0 ],
  [ 0, 1, 0, 0, 0, 0, 0, 0 ],
  [ 0, 1, 0, 0, 0, 0, 0, 0 ] ] //what i keep getting
  [ [ 0, 1, 0, 0, 0, 0, 0, 0 ],
  [ 0, 0, 0, 0, 0, 0, 0, 0 ],
  [ 0, 0, 0, 0, 0, 0, 0, 0 ],
  [ 0, 0, 0, 0, 0, 0, 0, 0 ],
  [ 0, 0, 0, 0, 0, 0, 0, 0 ],
  [ 0, 0, 0, 0, 0, 0, 0, 0 ],
  [ 0, 0, 0, 0, 0, 0, 0, 0 ],
  [ 0, , 0, 0, 0, 0, 0, 1 ] ]//what i want

【问题讨论】:

您一遍又一遍地推动同一行。您应该在每个循环中添加一个 new 行。 【参考方案1】:

此代码仅创建一个板行数组newArray,而不是所需的 8 个。数组 arrayz 中的所有 8 个条目都只是对 newArray 的引用。修改其中任何一个都会修改所有8个,这显然不是本意。

其实在 Stack Overflow 上打印这里的输出显示:

[
  [
    /**id:2**/
    0,
    1,
    0,
    0,
    0,
    0,
    0,
    0
  ],
  /**ref:2**/,
  /**ref:2**/,
  /**ref:2**/,
  /**ref:2**/,
  /**ref:2**/,
  /**ref:2**/,
  /**ref:2**/
]

将每个引用数组标记为指向第一个 id 为 2 的元素的指针。这是可运行的示例:

const generateBoard= function()

  let arrayz = []
  let set= []
  let newArray = []


  for (i = 0; i < 8; i++)

      newArray.push(0)
   
  for (y = 0; y < 8; y++)
      //newArray[0][1] = 1
      arrayz.push(newArray)  
      arrayz[0][1] = 1 //my failed code that im trying to use to input a single one

    
  return arrayz
  

console.log(generateBoard())

可以通过多种方式解决参考问题。例如,改变

arrayz.push(newArray)  

arrayz.push(newArray.slice()); 

使用Array#slice 制作newArray 的真实副本,消除不需要的别名。


另一种制作二维零网格的方法是使用Array 构造函数Array#fillArray#map

const board = Array(8).fill().map(() => Array(8).fill(0));
board[0][1] = 1;
console.log(board);

【讨论】:

以上是关于制作一个上面有两个皇后的棋盘[重复]的主要内容,如果未能解决你的问题,请参考以下文章

棋盘问题 dfs分层搜索(n皇后变式)

递归回溯之八皇后问题详解

2N皇后

2N皇后问题

蓝桥杯 2n皇后问题

蓝桥杯训练 2n皇后