C# 在C中使用LINQ获得数独板中的3x3组#
我试图制作一个程序,检查给定的数独板是否有效(正确求解)。 我也想使用linq来实现这一点,但是我发现很难找到一个解决方案来从电路板上获得所有3x3组。 我希望将它们作为C# 在C中使用LINQ获得数独板中的3x3组#,c#,linq,C#,Linq,我试图制作一个程序,检查给定的数独板是否有效(正确求解)。 我也想使用linq来实现这一点,但是我发现很难找到一个解决方案来从电路板上获得所有3x3组。 我希望将它们作为IEnumerable获取,因为我是如何编写其余代码的。 到目前为止,我的解决方案如下: public static bool IsValidSudoku(IEnumerable<IEnumerable<int>> sudokuBoard) { if (sudoku
IEnumerable
获取,因为我是如何编写其余代码的。
到目前为止,我的解决方案如下:
public static bool IsValidSudoku(IEnumerable<IEnumerable<int>> sudokuBoard)
{
if (sudokuBoard == null)
{
throw new ArgumentNullException();
}
var columns = Enumerable.Range(0, 9)
.Select(lineCount => Enumerable.Range(0,9)
.Select(columnCount=>sudokuBoard
.ElementAt(columnCount)
.ElementAt(lineCount)
));
var groups = //this is where I got stuck
return columns.All(IsValidGroup) &&
sudokuBoard.All(IsValidGroup) &&
groups.All(IsValidGroup);
}
static bool IsValidGroup(IEnumerable<int> group)
{
return group.Distinct().Count() == group.Count()&&
group.All(x => x <= 9 && x > 0)&&
group.Count() == 9;
}
public static bool IsValidSudoku(IEnumerable sudokuBoard)
{
if(sudokuBoard==null)
{
抛出新ArgumentNullException();
}
变量列=可枚举的范围(0,9)
.选择(lineCount=>Enumerable.Range(0,9)
.选择(columnCount=>sudokuBoard
.ElementAt(列计数)
.ElementAt(行计数)
));
var groups=//这就是我被卡住的地方
返回列.All(IsValidGroup)&&
sudokuBoard.All(IsValidGroup)&&
组。全部(IsValidGroup);
}
静态布尔IsValidGroup(IEnumerable组)
{
返回组.Distinct().Count()==group.Count()&&
全部组(x=>x0)&&
group.Count()==9;
}
性能在这里并不重要。
谢谢你的建议 您需要两个枚举数来选择要选择的3x3组,然后可以使用.Skip和.Take来运行三个元素来获取这些组
var groups = Enumerable.Range(0, 3).SelectMany(gy =>
Enumerable.Range(0, 3).Select(gx =>
// We now have gx and gy 0-2; find the three rows we want
sudoBoard.Skip(gy * 3).Take(3).Select(row =>
// and from each row take the three columns
row.Skip(gx * 3).Take(3)
)
));
这将根据请求为您提供
IEnumerable
的IEnumerable
s。但是,要将每个组传递给IsValidGroup,您必须将3x3IEnumerable
展平为9长IEnumerable
s,例如groups.Select(group=>group.SelectMany(n=>n))
您可能需要两个枚举范围0-2作为组的x和y索引(即您想要的3x3平方),然后再增加两个0-2的范围来收集组中的元素。但实际上,您需要通过索引访问正方形,因此将板作为列表(而不是可枚举的)或2D int数组可能更简单。(或者我猜这是‘性能不重要’的要点?)我正在测试包含9个数组的数组,这些数组代表数独板的行,所以要通过索引访问,我可以使用ElementAt。我只是无法理解这样做的逻辑。。。