↑Programmieren in Rust
// Erschöpfende Suche mittels Backtracking-Verfahren. // Listet sämtliche Lösungen eines Sudokus auf. struct Sudoku { data: [[u32; 9]; 9] } impl std::fmt::Display for Sudoku { fn fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result { for (i, row) in self.data.iter().enumerate() { if i != 0 && i%3 == 0 { writeln!(f, "------+-------+------")?; } for (j, cell) in row.iter().enumerate() { if j != 0 { write!(f, "{}", if j%3 == 0 {" | "} else {" "})?; } write!(f, "{}", cell)?; } writeln!(f)?; } Ok(()) } } impl Sudoku { fn from_input(s: &str) -> Self { let mut data = [[0; 9]; 9]; let mut i = 0; let mut j = 0; for c in s.chars() { if let Some(digit) = c.to_digit(10) { data[i][j] = digit; j += 1; } else if c == '.' { data[i][j] = 0; j += 1; } if j == 9 {j = 0; i += 1;} } Self {data} } fn unique(&self, digit: u32, i: usize, j: usize) -> bool { for k in 0..9 { if digit == self.data[k][j] {return false;} if digit == self.data[i][k] {return false;} } let i = (i/3)*3; let j = (j/3)*3; for x in 0..3 { for y in 0..3 { if digit == self.data[i+x][j+y] {return false;} } } true } } fn solve(s: &mut Sudoku, callback: &mut dyn FnMut(&Sudoku)) { for i in 0..9 { for j in 0..9 { if s.data[i][j] == 0 { for digit in 1..10 { if s.unique(digit, i, j) { s.data[i][j] = digit; solve(s, callback); s.data[i][j] = 0; } } return; } } } callback(s); } static S1: &str = " . . 3 | . . 9 | 6 . . 4 . . | . . 2 | . . 3 8 6 2 | 1 5 3 | . 9 . ------+-------+------ 5 . 7 | 2 . 6 | . 3 . . 3 . | 5 . . | . . . 6 . 9 | . 7 . | . 5 1 ------+-------+------ . 2 . | 4 . 8 | . . 7 . 4 . | . 3 . | . 2 . 3 . . | . 2 5 | 1 4 8 "; static S2: &str = " 9 . . | . . . | . . . . . . | . . 1 | . . 7 5 . . | . . 3 | . . 4 ------+-------+------ . . 7 | . . . | 2 . . . . 3 | 6 . 8 | . . . . . . | 4 . . | 6 1 . ------+-------+------ . 8 5 | . 4 . | . . . . . . | 3 2 . | . 6 . . 4 . | . 1 . | . 9 . "; fn solve_sudoku(input: &str) { let s = &mut Sudoku::from_input(input); let mut count = 0; solve(s, &mut |solution| { count += 1; println!("Lösung Nr. {}", count); println!("{}", solution); }); } fn main() { solve_sudoku(S1); solve_sudoku(S2); }