Выдвижение из очереди с приоритетами здесь без просмотра:
let v = d.get_mut(&key).unwrap();
mat[i][j] = v.pop().unwrap().0;
Результат (вывод):
input:
9 8 7
6 5 4
3 2 1
output:
1 4 7
2 5 8
3 6 9
И вы можете использовать std::cmp::Reverse
для обратного упорядочение:
use std::cmp::Reverse;
use std::collections::BinaryHeap;
use std::collections::HashMap;
pub fn diagonal_sort(mat: Vec<Vec<i32>>) -> Vec<Vec<i32>> {
let mut mat = mat.clone();
let mut mh: HashMap<i32, BinaryHeap<_>> = HashMap::new();
for i in 0..mat.len() {
for j in 0..mat[0].len() {
let key = i as i32 - j as i32;
mh.entry(key)
.or_insert(BinaryHeap::new())
.push(Reverse(mat[i][j]));
}
}
for i in 0..mat.len() {
for j in 0..mat[0].len() {
let key = i as i32 - j as i32;
let q = mh.get_mut(&key).unwrap();
match q.pop().unwrap() {
Reverse(v) => mat[i][j] = v,
}
}
}
mat
}
fn main() {
let m = vec![vec![9, 8, 7], vec![6, 5, 4], vec![3, 2, 1]];
show("input:", &m);
let s = diagonal_sort(m);
show("output:", &s);
}
fn show(s: &str, mat: &Vec<Vec<i32>>) {
println!("{}", s);
let m = mat.len();
let n = mat[0].len();
for i in 0..m {
for j in 0..n {
print!("{} ", mat[i][j]);
}
println!();
}
}
Результат (вывод):
input:
9 6 3
8 5 2
7 4 1
output:
1 2 3
4 5 6
7 8 9
Попробуйте это (для различных по диагонали элементов):
use priority_queue::PriorityQueue;
use std::collections::HashMap;
fn diagonal_sort(mat: Vec<Vec<i32>>) -> Vec<Vec<i32>> {
let mut d: HashMap<i32, PriorityQueue<i32, i32>> = HashMap::new();
let mut mat = mat.clone();
let m = mat.len();
let n = mat[0].len();
for i in 0..m {
for j in 0..n {
let key = i as i32 - j as i32;
let v = -mat[i][j];
d.entry(key).or_insert(PriorityQueue::new()).push(v, v);
}
}
for i in 0..m {
for j in 0..n {
let key = i as i32 - j as i32;
let v = d.get_mut(&key).unwrap();
mat[i][j] = -v.pop().unwrap().0;
}
}
mat
}
fn main() {
let m = vec![vec![9, 6, 3], vec![8, 5, 2], vec![7, 4, 1]];
show("input:", &m);
let s = diagonal_sort(m);
show("output:", &s);
}
fn show(s: &str, mat: &Vec<Vec<i32>>) {
println!("{}", s);
let m = mat.len();
let n = mat[0].len();
for i in 0..m {
for j in 0..n {
print!("{} ", mat[i][j]);
}
println!();
}
}