有一个5*5的网格,其中恰好有一个格子是空的,其他格子各有一个字母。一共有4种指令:A, B, L, R,分别表示把空格上、下、左、右的相邻字母移到空格中。输入初始网格和指令序列(以数字0结束),输出指令执行完毕后的网格。如果有非法指令,应输出“This puzzle has no final configuration.”,例如,图3-5中执行ARRBBL0后,效果如图3-6所示。

样例:
输入
TRGSJ
XDOKI
M VLN
WPABE
UQHCF
ARRBBL0
输出
TRGSJ
XOKLI
MDVBN
WP AE
UQHCF
解法:
use std::{collections::HashMap, io};
fn main() {
let mut grid: Vec<Vec<char>> = vec![];
for _i in 0..5 {
let mut buf = String::new();
io::stdin().read_line(&mut buf).unwrap();
let cs = buf.trim().chars().collect();
grid.push(cs);
}
//println!("{:#?}", grid);
let mut buf = String::new();
io::stdin().read_line(&mut buf).unwrap();
let cmds = buf.trim();
//println!("{}", cmds);
let mut kong = (0, 0);
for i in 0..5 {
for j in 0..5 {
if grid[i][j] == ' ' {
kong = (i, j);
break;
}
}
}
let run_directions =
HashMap::from([('A', (-1, 0)), ('B', (1, 0)), ('L', (0, -1)), ('R', (0, 1))]);
for i in cmds.chars() {
if kong.0 < 1 || kong.0 >= 4 || kong.1 < 1 || kong.1 >= 4 {
panic!("This puzzle has no final configuration");
}
if i == '0' {
break;
}
let d = run_directions.get(&i).unwrap();
let x = (kong.0 as i32 + d.0) as usize;
let y = (kong.1 as i32 + d.1) as usize;
let c = grid[x][y];
grid[kong.0][kong.1] = c;
grid[x][y] = ' ';
kong = (x, y);
}
//println!("{:#?}", grid);
for v in grid.iter(){
println!("{}", v.iter().collect::<String>());
}
}