-
Rust lang) 백준 7562번 : 나이트의 이동Rust 2024. 1. 16. 11:31
## GPT code
use std::collections::VecDeque; use std::io; fn bfs(start_x: usize, start_y: usize, end_x: usize, end_y: usize, l: usize, matrix: &mut Vec<Vec<i32>>) -> i32 { let dx = [-1, 1, 2, 2, 1, -1, -2, -2]; let dy = [2, 2, 1, -1, -2, -2, -1, 1]; let mut q = VecDeque::new(); q.push_back((start_x, start_y)); while let Some((x, y)) = q.pop_front() { if x == end_x && y == end_y { return matrix[x][y] - 1; } for i in 0..8 { let nx = x as isize + dx[i]; let ny = y as isize + dy[i]; if nx >= 0 && ny >= 0 && nx < l as isize && ny < l as isize && matrix[nx as usize][ny as usize] == 0 { matrix[nx as usize][ny as usize] = matrix[x][y] + 1; q.push_back((nx as usize, ny as usize)); } } } 0 } fn main() { let mut input = String::new(); io::stdin().read_line(&mut input).unwrap(); let t: usize = input.trim().parse().unwrap(); for _ in 0..t { input.clear(); io::stdin().read_line(&mut input).unwrap(); let l: usize = input.trim().parse().unwrap(); input.clear(); io::stdin().read_line(&mut input).unwrap(); let mut iter = input.trim().split_whitespace(); let start_x: usize = iter.next().unwrap().parse().unwrap(); let start_y: usize = iter.next().unwrap().parse().unwrap(); input.clear(); io::stdin().read_line(&mut input).unwrap(); let mut iter = input.trim().split_whitespace(); let end_x: usize = iter.next().unwrap().parse().unwrap(); let end_y: usize = iter.next().unwrap().parse().unwrap(); let mut matrix = vec![vec![0; l]; l]; matrix[start_x][start_y] = 1; println!("{}", bfs(start_x, start_y, end_x, end_y, l, &mut matrix)); } }
*동작이 안되는 코드 -> for문으로 고치는 중
// https://www.acmicpc.net/problem/7562 // 재귀가 있어 러스트로 못푸는 문제, 소유권 에러가 난다. use std::io::{stdin, BufReader, BufRead}; use std::collections::VecDeque; struct Point{ x: i32, y: i32, cnt: i32, } impl Point { pub fn new(x:i32, y:i32)->Self{ Self { x, y, cnt : 0 } } pub fn new_wiht_cnt(x:i32, y:i32, cnt:i32)->Self{ Self { x, y, cnt } } } pub fn bfs(arr: Vec<i32>, points: Vec<Point>, max_len_one_side: usize) -> i32{ let range_x= [-1, -2, -2, -1, 1, 2, 2, 1]; let range_y= [-2, -1, 1, 2, 2, 1, -1, -2]; let mut deque: VecDeque<&Point> = VecDeque::new(); deque.push_back(&points[0]); let mut visited: Vec<Vec<bool>>= Vec::new(); visited[points[0].x as usize][points[0].y as usize]= true; while !deque.is_empty() { let point= deque.pop_front().unwrap(); if &point.x == &points[1].x && &point.y == &points[1].y{ return point.cnt; } for i in 0..8 { let dx= point.x + range_x[i]; let dy= point.y + range_y[i]; if dx < 0 || dy< 0 || dx >= max_len_one_side as i32 || dy>= max_len_one_side as i32{ continue; } if !visited[dx as usize][dy as usize] { visited[dx as usize][dy as usize]= true; deque.push_back(&Point::new_wiht_cnt(dx, dy, point.cnt + 1)); } } } return -1; } fn main() { let mut results: Vec<i32>= Vec::new(); let mut two_dimention_arrs: Vec<Vec<i32>>= Vec::new(); let mut points: Vec<Point>= Vec::new(); let mut arr: Vec<i32>= Vec::new(); let std= stdin(); let mut buf= std.lock().lines(); let input= buf.next().unwrap().unwrap(); let input_n: usize= input.trim().parse().unwrap(); for _ in 0..input_n{ let max_len_one_side: usize= buf.next().unwrap().unwrap().parse().unwrap(); let current_koma_xy: Vec<i32>= buf.next().unwrap().unwrap() .trim().split_whitespace().map(|f| f.parse().unwrap()).collect(); let will_koma_xy: Vec<i32>= buf.next().unwrap().unwrap() .trim().split_whitespace().map(|f| f.parse().unwrap()).collect(); const X: usize= 0; const Y: usize= 0; if ¤t_koma_xy[X] == &will_koma_xy[X] && ¤t_koma_xy[Y] == &will_koma_xy[Y]{ results.push(0_i32); } // value movedd points.push(Point::new(current_koma_xy[X], current_koma_xy[Y])); points.push(Point::new(will_koma_xy[X], will_koma_xy[Y])); // progress results.push(bfs(arr.clone(), points, max_len_one_side,)); } }
'Rust' 카테고리의 다른 글
Rust lang) 백준 2108번 통계학 (0) 2024.01.18 Rust lang) 백준 11047번 동전 0 (0) 2024.01.18 Rust lang) leetcode 207. Course Schedule (0) 2024.01.11 Rust lang) 백준 15903 카드 합체 놀이 (1) 2024.01.09 Rust Lang) 백준 2002 추월 (0) 2024.01.09