如何对角分组正方形网格

Eva*_*val 6 c# linq algorithm diagonal

我有一串代表方形网格的布尔值。

0100001110000100
Run Code Online (Sandbox Code Playgroud)

表示为网格的布尔字符串

我正在尝试编写验证例程,该例程对角线检查网格,以确保其中不存在具有多个“1”值的对角线。

在此输入图像描述

从这个例子中可以看出,第五组有两个。

为了做到这一点,我想将网格排列成集合,然后检查每个集合以查看它是否具有多个“1”值。

下面显示的是排列为集合的值,以及每个值在原始字符串中的位置。

0       0  
01      4  1
100     8  5  2
0010    12 9  6 3
101     13 10 7
00      14 11 
0       15 
Run Code Online (Sandbox Code Playgroud)

我一直在试图找出字符串位置和它属于哪个组之间的数学关系。我尝试过各种公式,但我数学不太好,所以我被难住了。

作为参考,下面的方法是我用来水平验证字符串的方法。我想要提出的解决方案需要像这样,使用 LINQ 和基于集合的操作,而不是使用许多尴尬的循环。我正在进行的练习是关于在风电场中放置涡轮机的代码套路。

    public bool HorizontalValidate(string windfarm)
    {
        var farmSize = (int) Math.Sqrt(windfarm.Length);

        var rows = Enumerable.Range(0, farmSize)
            .Select(x => windfarm.Substring(x * farmSize, farmSize))
            .ToList();

        if (rows.Select(x => x.Count(y => y == '+')).Max() > 1)
            return false;

        return true;
    }
Run Code Online (Sandbox Code Playgroud)

如果有人感兴趣,这里有一个链接: Windfarm Kata

Dmi*_*nko 6

如果您正在寻找从左下到右上的对角线,您可以利用对角线上的所有项目都具有恒定column + row值的事实:

var int[][] grid = ...

bool result = grid
   .SelectMany((line, row) => line
       .Select((item, column) => (item, diag : row + column)))
   .Where(pair => pair.item == 1)    // Let's keep 1's only
   .GroupBy(pair => pair.diag)       // required GroupBy
   .Any(group => group.Count() > 1);
Run Code Online (Sandbox Code Playgroud)

如果你想查询windfarm代表方格网格的字符串,你可以这样做:

string windfarm = "0100110010000100";
int n = (int)Math.Sqrt(windfarm.Length);

bool result = windfarm
   .Select((c, index) => (item : c - '0', diag : index / n + index % n))
   .Where(pair => pair.item == 1)
   .GroupBy(pair => pair.diag)
   .Any(group => group.Count() > 1);
Run Code Online (Sandbox Code Playgroud)

小提琴

如果是从左上到右下的对角线,我们应该使用row - column代替row + column(或index / n - index % n代替index / n + index % n