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

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#使用属性和值将JSON转换为XML

C#相同名称的枚举方法和normal方法,参数类型不同

CS0103 dlibdotnet和www.example.com facerect不在上下文中

如何修改中间件或其注册以正确使用作用域服务?

在C#WinUI中,一个关于System的崩溃."由于未知原因导致执行不例外"

如何在C#中使用正则表达式抓取用逗号分隔的两个单词?

Blazor WebApp:原始异常:AADSTS700025:客户端是公共的,因此既不应显示客户端,也不应显示客户端

如何使用C#获取FireStore中的列表输出文档

异步任务导致内存泄漏

C#中浮点数的System.Text.Json序列化问题

在C#中,非静态接口方法的抽象和虚拟是冗余的吗?

EF核心区分大小写的主键

等待一个等待函数

链接到字典字符串.拆分为(.Key,.Value)

数据库.Migrate在对接容器重启时失败

如何在GRPC代码First服务的返回类型上使用多态性?

Foreach非常慢的C#

C# -根据列表所包含的值的数量组织列表- C#

在素数排序数组中,arr找到arr中最小数的索引i,使得arr[i]除以给定的数