我有一个代表正方形网格的布尔值字符串.

0100110010000100

boolean string represented as a grid

我试图写验证 routine ,判断网格对角线,以确保没有对角线上有一个以上的'1'值.

enter image description here

从这个例子中可以看出,第五组有两个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 

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

作为参考,下面的方法是我用来水平验证字符串的方法.我想要想出的解决方案需要是这样的,使用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;
    }

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

推荐答案

如果您正在寻找从左下角到右上角的对角线,您可以利用对角线上的所有项目都具有恒定的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);

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

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);

Fiddle

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

Csharp相关问答推荐

如何将两个查询结果组合在C#ASP.NET MHC控制器中

利用.NET 8中的AddStandardResilienceDeliveries和AddStandardHedgingDeliveries实现Resiliency

无法将blob发送到Azure -缺少HTTP标头异常

更新数据库中的对象失败,原因是:Microsoft. EntityFrame Core. GbUpdateConcurrencyResponse'

.NET框架4.7.2项目如何引用.NET Core 2.2库?

使用变量子根名称在C#中重新初始化SON文件

需要深入了解NpgSQL DateTimeOffset处理

我无法在Ubuntu下编译使用microsoft.extension.configurationbuilder jsonapi和mono mcs的c#应用程序

NumPy s fftn in C#with pythonnet'

Blazor EventCallback<;MyType<;T>;>;

如何使用C#中的主构造函数功能使用多个构造函数?

System.Text.Json .NET 8多形态语法化

Regex字母数字校验

如何在mediatr命令中访问HttpContext而不安装弃用的nuget包

如何从Azure函数使用Graph API(SDK 5.35)中的[FindMeetingTimes]

当要删除的子模型没有父模型的1:多属性时,如何告诉实体框架设置1:1 FK条目?

使用SQL Server 2022+时,我是否必须将代码从SqlConnection类对象中迁移出来?

获取应用程序版本信息时出现奇怪信息

根据运行时值获取泛型类型的字典

从具有泛型类型约束的类继承-Blazor