如何使用 struct 覆盖二维数组中的所有整数?

Posted

技术标签:

【中文标题】如何使用 struct 覆盖二维数组中的所有整数?【英文标题】:How to use struct to cover all integers in 2d array? 【发布时间】:2020-08-21 00:25:39 【问题描述】:

这是我的第一篇文章。 我现在正在学习编程课程,我目前的任务是创建一个整数(我们称之为蚂蚁),它将移动到二维数组(随机路径)中的所有整数。到目前为止,这是我的代码:


namespace Ant

    class Program
    
        static void Main(string[] args)
        
            int ant;
            int i = 0;
            int[,] numberGrid =
            
                1, 2,
                3, 4,
                5, 6,
                7, 8,
                9, 10,
                10, 11,
                11, 12,
                13, 14,
                15, 16,
                17, 18,
                19, 20,
            ;
            do
            

                Random rand = new Random();
                ant= rand.Next(numberGrid[10, 1]);
                Console.WriteLine(ant);
                i++;
             while (i !=110);
            Console.WriteLine("It took 0 steps for the ant to cover all spaces!", i);
        
    

我有 2d 数组,我暂时将 ant 设置为随机路径,该路径将在停止之前持续 110 次。我应该将 struct 集成到其中,这样蚂蚁只会在它访问了 2d 数组的所有整数而不是一定次数之前才会去,但我完全不知道我应该怎么做这。如果有人能帮助我理解,那就太好了,谢谢!

【问题讨论】:

你想让ant执行110步吗?目前,您的代码仅在地图的 (not even) 随机单元格处生成 ant 110 次。或者这个数组到底是什么?可以用函数代替。 听起来你应该创建一个名为“Ant”的结构来存储 x 和 y 坐标,而不是像你所做的那样创建一个 int。就空间而言,一旦访问过它们,您就可以简单地从列表或其他东西中删除坐标,因此您只剩下未访问过的空间。一旦该列表为空,您就已经全部访问过了。您可以将该逻辑包装在一个while循环或其他东西中。 【参考方案1】:

如果没有更多关于您期望如何执行此操作的详细信息,听起来您需要将 Ant 设为结构并记录 Ant 曾经(或不曾)在哪里。这是您可以做到的一种方法,尽管我确信在性能方面有更好的方法:

static void Main(string[] args)

    var unvisitedSpaces = new List<Coordinates>
    
        //I've used your numbers but should this be a full matrix i.e. [1,1], [1,2], [1,3] etc.?
        new Coordinates(1, 2),
        new Coordinates(3, 4),
        new Coordinates(5, 6),
        new Coordinates(7, 8),
        new Coordinates(9, 10),
        new Coordinates(11, 12),
        new Coordinates(13, 14),
        new Coordinates(15, 16),
        new Coordinates(17, 18),
        new Coordinates(19, 20) 
    ;

    var ant = new Ant();
    int counter = 0;
    var r = new Random();
    var min = Math.Min(unvisitedSpaces.Min(x => x.X), unvisitedSpaces.Min(y => y.Y));
    var max = Math.Max(unvisitedSpaces.Max(x => x.X), unvisitedSpaces.Max(y => y.Y)) + 1;

    do
    
        ant.X = r.Next(min, max);
        ant.Y = r.Next(min, max);
        counter++;

        //check if the ant hasn't visited this space by checking the unvisitedSpaces list.
        if (unvisitedSpaces.Any(c => c.X == ant.X && c.Y == ant.Y))
        
            //if it hasn't visited (the list contains that set of coordinates) then remove it from the list as it's now visited it.
            var coord = unvisitedSpaces.FirstOrDefault(c => c.X == ant.X && c.Y == ant.Y);
            unvisitedSpaces.Remove(coord);
        
     while (unvisitedSpaces.Count() > 0);

    Console.WriteLine("It took 0 steps for the ant to cover all spaces!", counter);
    Console.ReadLine();


public struct Coordinates

    public int X  get; 
    public int Y  get; 

    public Coordinates(int x, int y)
    
        X = x;
        Y = y;
    


public struct Ant

    public int X  get; set; 
    public int Y  get; set; 

结果:

更新

添加了通过从坐标矩阵中获取它们来自动调整“随机”使用的最大值和最小值的功能。因此,对矩阵的任何调整都应包含在“蚂蚁”访问的空间中。

【讨论】:

好的,谢谢!这正是我所要求的。我也调整了坐标,所以我有 [1, 1], [1, 2].. 等一直到 [1, 30]。它完全按照需要工作,如果没有您的帮助,我将无法做到。 @Anthony - 如果您已将矩阵增加到 30,请确保将最大随机数增加到 31。更好的是,将随机数中使用的值设置为从列表中的最小值和最大值检索

以上是关于如何使用 struct 覆盖二维数组中的所有整数?的主要内容,如果未能解决你的问题,请参考以下文章

1893. 检查是否区域内所有整数都被覆盖

如何按整数读取文件整数并将它们放入二维数组?

《LeetCode之每日一题》:100.检查是否区域内所有整数都被覆盖

二维数组中的查找

二维数组中的查找

如何使用 Matlab mex 输出二维整数数组?