mutexで見にくいが、やってることは単純で、上下左右ではなく、行けるだけ上、下、左、右に移動して、行けるところがなくなったら、元に戻るというロジック。これも素晴らしいね。
use std::collections::VecDeque; use std::sync::Mutex; static maze: Mutex<[[usize; 12]; 12]> = Mutex::new([ [9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9], [9, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 9], [9, 0, 9, 0, 0, 0, 9, 9, 0, 9, 9, 9], [9, 0, 9, 9, 0, 9, 0, 0, 0, 9, 0, 9], [9, 0, 0, 0, 9, 0, 0, 9, 9, 0, 9, 9], [9, 9, 9, 0, 0, 9, 0, 9, 0, 0, 0, 9], [9, 0, 0, 0, 9, 0, 9, 0, 0, 9, 1, 9], [9, 0, 9, 0, 0, 0, 0, 9, 0, 0, 9, 9], [9, 0, 0, 9, 0, 9, 0, 0, 9, 0, 0, 9], [9, 0, 9, 0, 9, 0, 9, 0, 0, 9, 0, 9], [9, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, 9], [9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9] ]); fn search(p:[usize; 3]) { if maze.lock().unwrap()[p[0]][p[1]] == 1 { println!("ゴール:{}-{}", p[0], p[1]); println!("移動回数:{}", p[2]); // z return; } maze.lock().unwrap()[p[0]][p[1]] = 2; if maze.lock().unwrap()[p[0] - 1][p[1]] < 2 { search([p[0]- 1, p[1], p[2] + 1]); } if maze.lock().unwrap()[p[0] + 1][p[1]] < 2 { search([p[0]+1, p[1], p[2] + 1]); } if maze.lock().unwrap()[p[0]][p[1] - 1] < 2 { search([p[0], p[1] -1, p[2] + 1]); } if maze.lock().unwrap()[p[0]][p[1] + 1] < 2 { search([p[0], p[1] + 1, p[2] + 1]); } maze.lock().unwrap()[p[0]][p[1]] = 0; } fn main() { search([1, 1, 0]) }
Finished `dev` profile [unoptimized + debuginfo] target(s) in 0.41s
Running `target/debug/rust`
ゴール:6-10
移動回数:28