在随机场所将棋子放在棋盘上的最佳方法是什么?

时间:2009-01-08 03:19:02

标签: c# arrays algorithm random

我必须解决这个问题的想法是组成一个大小为8x8的缓冲区,用指向我的检查器的指针(所有20个)填充它,其余的离开0(null),然后运行一个shuffling算法在缓冲区上,就是这样(只是把它读成8x8数组)

  1. 我想知道是否有更好的方法来做到这一点。
  2. 我需要用C#编写它,我的提议不会像我描述的那样工作
  3. 有人吗?

4 个答案:

答案 0 :(得分:7)

为了搭载Borzio的想法,当你接近第二十件时,有三分之一的机会你需要重新生成随机数并再试一次。有20件,你可能仍然是安全的,但如果你有40件,那么你的机会就会超过两分之一,而你可能会等待一段时间。

  1. 构建电路板阵列,全部为空。
  2. 将对每个棋盘方块的引用复制到列表(emptySquareList)。
  3. 要添加的每件作品的循环:
    1. 0emptySquareList.Length-1之间生成一个随机数。
    2. 把那块放在那个方格里
    3. emptySquareList
    4. 中删除方块
  4. 这样,你总是维护一个方块的列表,并从中进行选择。请注意,电路板阵列中的索引数组也可以更快地运行(Enumerable.Range(0,64))。

    我鼓励你尝试使用随机和检查算法,以及这个算法;看哪一个更有效率。

答案 1 :(得分:0)

一个8x8矩阵,包含指向对象或引用(c#/ java)的指针(c ++),这似乎是一个非常合理的设计。

您可以使用64个元素的一维数组(您可以轻松地将2D索引映射到一维数组)并使用以下内容:

using System;
using System.Linq;

Piece[] board = whatever();

// New random number generator.
Random random = new Random();

// LINQ query orders each element by the next random number.
Piece[] randomBoard = (from piece in board
    orderby random.Next()
    select piece).ToArray();

注意:我不是c#程序员,但这似乎是合理的。

要将x,y对转换为数组索引,请使用以下算法:

int index = (y * 8) + x;

注意2:我不知道你是否必须遵守跳棋的放置规则,如果你这样做,你需要做一些更聪明的事情。你可能有一个32个元素的数组(代表所有的黑色方块)。在其中随机播放,然后将32个大数组中的每个元素分配给真实64个元素数组的每个“黑色”方块。

答案 2 :(得分:0)

如果你必须遵循放置规则,给定你的8x8矩阵示例,我也会认为它是一个1d数组,正如Evan指出的那样 - (参见他确定x& y的数学) -

黑白方块是奇数和偶数索引值;但是,嘿,你从来没有说过你需要放置规则 - 我也认为你不是在寻找c#代码而是在寻找更多“逻辑”级别的想法...

如果您正在尝试使用Linq-Challenged解决方案,请考虑以下事项;

  1. 构造“board”数组,全部为空; (64个元素)
  2. 构建由您的作品组成的“游戏片段”
  3. 创建一个从1到#件的循环
  4. 在1到6个板空间(64)之间生成一个随机数
  5. 如果#4指向的电路板空间为!0,则重做步骤4(或者您可以“同时”!0)
  6. 将该片(步骤3中的#)从步骤4放入方形X
  7. 只有一个想法肯定会很多 -

    希望它有所帮助...

答案 3 :(得分:0)

回答提出的问题:

  1. 将第一个棋子放在一个尚未占用的随机位置
  2. 重复其他19件
  3. 说真的,你还没有给我们足够的信息来继续回答这个问题。这是一些问题:

    • 哪些棋子?
    • 哪种颜色(每种颜色有16种),颜色是否重要?白人是否必须避免被黑人俘获,反之亦然?

    假设没有规则要遵循,除了你需要将所有20个放在板上,即。没有碰撞,这将做你想要的:

    Piece[] pieces = ... your 20 pieces here
    Piece[] board = new Piece[8 * 8];
    Random r = new Random();
    foreach (Piece piece in pieces)
    {
        while (true)
        {
            Int32 location = r.Next(board.Length);
            if (board[location] == null)
            {
                board[location] = piece;
                break;
            }
        }
    }
    

    一个更简单的解决方案,只要你已经在某处有辅助例程,就是将它们放在64元素数组的开头,然后将整个数组洗牌。这会将这20个棋子和44个空方块洗牌,并将它们有效地置于随机位置。