【发布时间】:2021-11-01 17:57:20
【问题描述】:
这个程序是尝试使用递归和图形着色来读取和解决数独板。
type vertex = int * int
module Vertex = Map.Make(struct
type t = vertex
let compare = Stdlib.compare
end)
let ascii_digit c = Char.code c - Char.code '0'
let read_matrix chan =
let rec loop i j grid =
match input_char chan with
| exception End_of_file -> grid
| '\n' -> loop (i+1) 0 grid
| '0'..'9' as c ->
loop i (j+1) @@
Vertex.add (i,j) (ascii_digit c) grid
| _ -> invalid_arg "invalid input" in
loop 0 0 Vertex.empty
let matrix_from_file file =
let chan = open_in file in
let r = read_matrix chan in
close_in chan;
r
(*Print grid method*)
let print_vertex vertex =
let print_node (x,y) g =
Printf.printf "\n(%d, %d) = " x y;
print_int g
in
Vertex.iter print_node vertex
(*Print pretty sudoku*)
let print_board vertex =
let print_node (_x,_y) _grid =
if _y = 0 then
Printf.printf "\n | ";
print_int _grid;
print_string " | "
in
Vertex.iter print_node vertex
我正在尝试实现此 fold_neighbours,但无法使其与我的 (Map.Vertex) 一起使用。我认为我的逻辑是正确的,但是会出现很多错误等。也许我应该将这些功能分解为单独的功能?
let fold_neighbours v gamma game =
let in_quadrant (x1, y1) (x2, y2) =
x1/3 = x2/3 && y1/3 = y2/3
in
let is_neighbour v n =
in_quadrant v n || fst v = fst n || snd v = snd n
in
let filter v gamma =
if is_neighbour neigh v' then
f v' g' a
else
a
in
fold_vertices filter game
【问题讨论】:
-
我不确定这真的是一个 SO 问题。听起来您正在寻找有关sudoku solving algorithms 的信息。也就是说,您可能希望能够找出与任何给定顶点相同的行、列或 3x3 块中存在哪些数字。
-
也许可以尝试编写一个
numbers_known_in_column函数。这是一个“一口大小”的问题。 -
我立即注意到这一点:
is_neighbour neigh v'。v'来自哪里?就此而言,g'和a'来自于f v' g' a? -
另请注意,您在
fold_neighbors中的本地范围内的函数(如in_quadrant和is_neighbor)可能对您的工作通常有用,并且可能不应该在本地范围内仅限于一个函数. -
let is_neighbour v n = in_quadrant v n || fst v = fst n || snd v = snd n没有充分利用 Ocaml 的模式匹配能力。您可能希望编写类似:let is_neighbour (vx, vy) (nx, ny) = in_quadrant (vx, vy) (nx, ny) || vx = nx || vy = ny;甚至:let is_neighbour ((vx, vy) as v) ((nx, ny) as n) = in_quadrant v n || vx = nx || vy = ny。这与使用fst和snd函数相反。
标签: ocaml backtracking sudoku graph-coloring