哈斯克尔:获得数独解算器块 [英] Haskell: Get block for Sudoku solver

查看:108
本文介绍了哈斯克尔:获得数独解算器块的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我试图为我正在开发的一个项目构建一个Sudoku解算器。我有一个9x9网格,每个位置编号为0..80,从左到右,从上到下



例如:

0 1 2 3 4 5 6 7 8



9 10 ...



我在尝试返回表示位置落入的3x3网格的Int列表。例如,对于网格(0,0)中的位置1,它将返回[0,1,2,9,10,11,18, 19,20]和位于网格(0,2)的位置8,它将返回[6,7,8,15,16,17,24,25,26]。

我写了一个函数,它返回所需的3x3网格,在一个9x9的Sudoku中:

  getBlock :: Int  - > Int  - > [(Int]] 
getBlock xy = [[((x * sudokuSizeSq + 0)* sudokuSize)+(y * sudokuSizeSq + 0),((x * sudokuSizeSq + 0)* sudokuSize)+(y * sudokuSizeSq +(y * sudokuSizeSq + 0)*((x * sudokuSizeSq + 0)* sudokuSize)+(y * sudokuSizeSq +(sudokuSizeSq-1))],[((x * sudokuSizeSq + 1)* sudokuSize) ((x * sudokuSizeSq + 1)* sudokuSize)+(y * sudokuSizeSq + 1)...((x * sudokuSizeSq + 1)* sudokuSize)+(y * sudokuSizeSq +(sudokuSizeSq-1))] ((x * sudokuSizeSq + 2)* sudokuSize)+(y * sudokuSizeSq + 1)...((x * sudokuSizeSq + 2)* sudokuSize) +(y * sudokuSizeSq +(sudokuSizeSq-1))]]]



其中:
sudokuSizeSq是宽度的平方(3)
sudokuSize是宽度(9)

x和y代表可能的网格。



这有效,但是我想增加它,因此它可以适用于更大的网格。我改变了我的代码到后面,但它似乎不会加载函数。

  getBlock :: Int  - > Int  - > [(Int]] 
getBlock xy = [[((x * sudokuSizeSq + 0)* sudokuSize)+(y * sudokuSizeSq + 0),((x * sudokuSizeSq + 0)* sudokuSize)+(y * sudokuSizeSq +(y * sudokuSizeSq + 0)*((x * sudokuSizeSq + 0)* sudokuSize)+(y * sudokuSizeSq +(sudokuSizeSq-1))],[((x * sudokuSizeSq + 1)* sudokuSize) ((x * sudokuSizeSq + 1)* sudokuSize)+(y * sudokuSizeSq + 1)...((x * sudokuSizeSq + 1)* sudokuSize)+(y * sudokuSizeSq +(sudokuSizeSq-1))] (x * sudokuSizeSq +(sudokuSizeSq-1))* sudokuSize)+(y * sudokuSizeSq + 1)...((x * sudokuSizeSq +(sudokuSizeSq-1))* sudokuSize)+(y * sudokuSizeSq + 0) x * sudokuSizeSq +(sudokuSizeSq-1))* sudokuSize)+(y * sudokuSizeSq +(sudokuSizeSq-1))]]

我这样做的方式似乎很麻烦,有没有更好的方法来做到这一点或解决我遇到的问题。谢谢。

解决方案

  [a + b 
| a< - 取sudokuSizeSq $ map(sudokuSize *)[x * sudokuSizeSq ..]
,b< - 取sudokuSizeSq [y * sudokuSizeSq ..]]


I am trying to build a Sudoku solver for a project I am working on. I have a 9x9 grid with each position numbered 0..80, left to right, top to bottom

e.g.:

0 1 2 3 4 5 6 7 8

9 10 ...

I am trying to return a list of Int's that represent the 3x3 grid that a position falls in. For example for position 1, which is in grid (0,0) it would return [0,1,2,9,10,11,18,19,20] and for position 8, which is in grid (0,2) it would return [6,7,8,15,16,17,24,25,26].

I have written a function which returns the required 3x3 grid, on a 9x9 Sudoku:

getBlock :: Int -> Int -> [[Int]]
getBlock x y = [[((x * sudokuSizeSq + 0) * sudokuSize) + (y * sudokuSizeSq + 0),((x * sudokuSizeSq + 0) * sudokuSize) + (y * sudokuSizeSq + 1)..((x * sudokuSizeSq + 0) * sudokuSize) + (y * sudokuSizeSq + (sudokuSizeSq-1))],[((x * sudokuSizeSq + 1) * sudokuSize) + (y * sudokuSizeSq + 0),((x * sudokuSizeSq + 1) * sudokuSize) + (y * sudokuSizeSq + 1)..((x * sudokuSizeSq + 1) * sudokuSize) + (y * sudokuSizeSq + (sudokuSizeSq-1))],[((x * sudokuSizeSq + 2) * sudokuSize) + (y * sudokuSizeSq + 0),((x * sudokuSizeSq + 2) * sudokuSize) + (y * sudokuSizeSq + 1)..((x * sudokuSizeSq + 2) * sudokuSize) + (y * sudokuSizeSq + (sudokuSizeSq-1))]]

Where: sudokuSizeSq is the square of the width (3) sudokuSize is the width (9)

x and y represent the possible grids.

This works, however I would like to increase it so it will work for larger grids. I changed my code to the follow but it seems then wont load the function.

getBlock :: Int -> Int -> [[Int]]
getBlock x y = [[((x * sudokuSizeSq + 0) * sudokuSize) + (y * sudokuSizeSq + 0),((x * sudokuSizeSq + 0) * sudokuSize) + (y * sudokuSizeSq + 1)..((x * sudokuSizeSq + 0) * sudokuSize) + (y * sudokuSizeSq + (sudokuSizeSq-1))],[((x * sudokuSizeSq + 1) * sudokuSize) + (y * sudokuSizeSq + 0),((x * sudokuSizeSq + 1) * sudokuSize) + (y * sudokuSizeSq + 1)..((x * sudokuSizeSq + 1) * sudokuSize) + (y * sudokuSizeSq + (sudokuSizeSq-1))]..[((x * sudokuSizeSq + (sudokuSizeSq-1)) * sudokuSize) + (y * sudokuSizeSq + 0),((x * sudokuSizeSq + (sudokuSizeSq-1)) * sudokuSize) + (y * sudokuSizeSq + 1)..((x * sudokuSizeSq + (sudokuSizeSq-1)) * sudokuSize) + (y * sudokuSizeSq + (sudokuSizeSq-1))]]

The way I'm doing it seems very cumbersome, is there a better way to do this or a way to fix the problem I'm having. Thanks.

解决方案

[ a + b
| a <- take sudokuSizeSq $ map (sudokuSize *) [x * sudokuSizeSq .. ]
, b <- take sudokuSizeSq [y * sudokuSizeSq ..] ]

这篇关于哈斯克尔:获得数独解算器块的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆