Skip to content

Commit

Permalink
⚡ Update Artcile
Browse files Browse the repository at this point in the history
  • Loading branch information
kento committed Jan 25, 2025
1 parent 6cd50ae commit fdd9efe
Show file tree
Hide file tree
Showing 2 changed files with 279 additions and 108 deletions.
309 changes: 240 additions & 69 deletions content/blog/LearningRustThoughKyouPro/Ex1/index.md
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
---
title: "[番外編] アルゴリズム・データ構造ごとに問題を分類してみる"
postdate: "2023-11-23"
update: "2025-01-13"
update: "2025-01-25"
seriesName: "競プロで学ぶRust"
seriesSlug: "LearningRustThoughKyouPro"
description: "アルゴリズムやデータ構造ごとに解ける問題を分類しました。"
Expand Down Expand Up @@ -1157,6 +1157,243 @@ mod tests {

[BFS (幅優先探索) 超入門! 〜 キューを鮮やかに使いこなす 〜](https://qiita.com/drken/items/996d80bcae64649a6580)

### ABC007 C - 幅優先探索

[C - 幅優先探索](https://atcoder.jp/contests/abc007/tasks/abc007_3)(<span style="color: green">🧪 Difficulty : 1024</span>)

そのまんまの問題です。

<details>
<summary>コード例を見る</summary>

```rust
// https://atcoder.jp/contests/atc002/tasks/abc007_3

use std::collections::VecDeque;

fn run(r: usize, c: usize, s: (usize, usize), g: (usize, usize), v: Vec<&str>) -> usize {
let vec: Vec<Vec<char>> = v.into_iter().map(|c| c.chars().collect()).collect();

let mut graph = vec![vec![-1; c]; r];
let mut queue = VecDeque::new();

graph[s.0-1][s.1-1] = 0;
queue.push_back((s.0-1, s.1-1));

let dx = [0, -1, 0, 1];
let dy = [-1, 0, 1, 0];

while queue.len() > 0 {
let cur = queue.pop_front().unwrap();

for i in 0..4 {
let h = (cur.0 as isize + dx[i]) as usize;
let w = (cur.1 as isize + dy[i]) as usize;

if vec[h][w] == '#' || graph[h][w] != -1 {
continue;
}

graph[h][w] = graph[cur.0][cur.1] + 1;

queue.push_back((h, w));
}
}

graph[g.0-1][g.1-1] as usize
}

#[cfg(test)]
mod tests {
use super::*;

struct TestCase(usize, usize, (usize, usize), (usize, usize), Vec<&'static str>, usize);

#[test]
fn test() {
let tests = [
TestCase(7, 8, (2, 2), (4, 5), vec!["########", "#......#", "#.######", "#..#...#", "#..##..#", "##.....#", "########"], 11),
TestCase(5, 8, (2, 2), (2, 4), vec!["########", "#.#....#", "#.###..#", "#......#", "########"], 10),
TestCase(50, 50, (2, 2), (49, 49), vec!["##################################################", "#................................................#", "#................................................#", "#................................................#", "#................................................#", "#................................................#", "#................................................#", "#................................................#", "#................................................#", "#................................................#", "#................................................#", "#................................................#", "#................................................#", "#................................................#", "#................................................#", "#................................................#", "#................................................#", "#................................................#", "#................................................#", "#................................................#", "#................................................#", "#................................................#", "#................................................#", "#................................................#", "#................................................#", "#................................................#", "#................................................#", "#................................................#", "#................................................#", "#................................................#", "#................................................#", "#................................................#", "#................................................#", "#................................................#", "#................................................#", "#................................................#", "#................................................#", "#................................................#", "#................................................#", "#................................................#", "#................................................#", "#................................................#", "#................................................#", "#................................................#", "#................................................#", "#................................................#", "#................................................#", "#................................................#", "#................................................#", "##################################################"], 94),
];

for TestCase(r, c, s, g, v, expected) in tests {
assert_eq!(run(r, c, s, g, v), expected);
}
}
}
```
</details>

### ABC269 D - Do use hexagon grid

[D - Do use hexagon grid](https://atcoder.jp/contests/abc269/tasks/abc269_d)(<span style="color: brown">Difficulty : 629</span>)

連結成分を数える。

<details>
<summary>コード例を見る</summary>

```rust
// https://atcoder.jp/contests/abc269/tasks/abc269_d

use std::collections::VecDeque;

fn check(r: isize, c: isize) -> bool {
r < 0 || c < 0 || r >= 2001 || c >= 2001
}

fn run(_n: usize, xy: Vec<(isize, isize)>) -> usize {
let offset = 1000;

let xy: Vec<(isize, isize)> = xy.into_iter().map(|(x, y)| (x+offset, y+offset)).collect();

let mut vec = vec![vec![false; 2001]; 2001];

for (x, y) in xy.iter() {
vec[*x as usize][*y as usize] = true;
}

let dx = [0, 1, 1, 0, -1, -1];
let dy = [1, 1, 0, -1, -1, 0];

let mut ans = 0;

for (x, y) in xy.iter() {
if !vec[*x as usize][*y as usize] {
continue;
}

ans += 1;

let mut queue = VecDeque::new();

queue.push_back((*x, *y));

while let Some((cur_i, cur_j)) = queue.pop_front() {
if !vec[cur_i as usize][cur_j as usize] {
continue;
}

vec[cur_i as usize][cur_j as usize] = false;

for i in 0..6 {
if check(cur_i as isize + dx[i], cur_j as isize + dy[i]) {
continue;
}

let new_i = (cur_i as isize + dx[i]) as usize;
let new_j = (cur_j as isize + dy[i]) as usize;

if vec[new_i][new_j] {
queue.push_back((new_i as isize, new_j as isize));
}
}
}
}

ans
}

#[cfg(test)]
mod tests {
use super::*;

struct TestCase(usize, Vec<(isize, isize)>, usize);

#[test]
fn test() {
let tests = [
TestCase(6, vec![(-1, -1), (0, 1), (0, 2), (1, 0), (1, 2), (2, 0)], 3),
TestCase(4, vec![(5, 0), (4, 1), (-3, 4), (-2, -5)], 4),
TestCase(5, vec![(2, 1), (2, -1), (1, 0), (3, 1), (1, -1)], 1),
];

for TestCase(n, xy, expected) in tests {
assert_eq!(run(n, xy), expected);
}
}
}
```
</details>

### ABC211 D - Number of Shortest paths

[D - Number of Shortest paths](https://atcoder.jp/contests/abc211/tasks/abc211_d)(<span style="color: brown">Difficulty : 755</span>)

最短路をカウントする問題です。

<details>
<summary>コード例を見る</summary>

```rust
// https://atcoder.jp/contests/abc211/tasks/abc211_d

use std::collections::{HashMap, VecDeque};

fn run(n: usize, _m: usize, ab: Option<Vec<(usize, usize)>>) -> usize {
let Some(ab) = ab else {
return 0;
};

let mut vec = HashMap::new();

let md = 1000_000_007;

for (a, b) in ab {
vec.entry(a).or_insert_with(Vec::new).push(b);
vec.entry(b).or_insert_with(Vec::new).push(a);
}

let mut graph = vec![-1; n];
let mut queue = VecDeque::new();
let mut count = vec![0; n];

graph[0] = 0;
count[0] = 1;
queue.push_back(1);

while let Some(current) = queue.pop_front() {
if let Some(next) = vec.get(&current) {
for &next in next.iter() {
if graph[next-1] == -1 {
queue.push_front(next);
graph[next-1] = graph[current-1] + 1;
count[next-1] = count[current-1];
} else if graph[next-1] == graph[current-1] + 1 {
count[next-1] += count[current-1];
count[next-1] %= md;
}
}
};
}

count[n-1] as usize
}

#[cfg(test)]
mod tests {
use super::*;

struct TestCase(usize, usize, Option<Vec<(usize, usize)>>, usize);

#[test]
fn test() {
let tests = [
TestCase(4, 5, Some(vec![(2, 4), (1, 2), (2, 3), (1, 3), (3, 4)]), 2),
TestCase(4, 3, Some(vec![(1, 3), (2, 3), (2, 4)]), 1),
TestCase(2, 0, None, 0),
TestCase(7, 8, Some(vec![(1, 3), (1, 4), (2, 3), (2, 4), (2, 5), (2, 6), (5, 7), (6, 7)]), 4),
];

for TestCase(n, m, ab, expected) in tests {
assert_eq!(run(n, m, ab), expected);
}
}
}
```
</details>

### ABC016 C - 友達の友達

[C - 友達の友達 ](https://atcoder.jp/contests/abc016/tasks/abc016_3)(<span style="color: green">🧪 Difficulty : 830</span>)
Expand Down Expand Up @@ -1317,74 +1554,6 @@ mod tests {
```
</details>

### ABC007 C - 幅優先探索

[C - 幅優先探索](https://atcoder.jp/contests/abc007/tasks/abc007_3)(<span style="color: green">🧪 Difficulty : 1024</span>)

そのまんまの問題です。

<details>
<summary>コード例を見る</summary>

```rust
// https://atcoder.jp/contests/atc002/tasks/abc007_3

use std::collections::VecDeque;

fn run(r: usize, c: usize, s: (usize, usize), g: (usize, usize), v: Vec<&str>) -> usize {
let vec: Vec<Vec<char>> = v.into_iter().map(|c| c.chars().collect()).collect();

let mut graph = vec![vec![-1; c]; r];
let mut queue = VecDeque::new();

graph[s.0-1][s.1-1] = 0;
queue.push_back((s.0-1, s.1-1));

let dx = [0, -1, 0, 1];
let dy = [-1, 0, 1, 0];

while queue.len() > 0 {
let cur = queue.pop_front().unwrap();

for i in 0..4 {
let h = (cur.0 as isize + dx[i]) as usize;
let w = (cur.1 as isize + dy[i]) as usize;

if vec[h][w] == '#' || graph[h][w] != -1 {
continue;
}

graph[h][w] = graph[cur.0][cur.1] + 1;

queue.push_back((h, w));
}
}

graph[g.0-1][g.1-1] as usize
}

#[cfg(test)]
mod tests {
use super::*;

struct TestCase(usize, usize, (usize, usize), (usize, usize), Vec<&'static str>, usize);

#[test]
fn test() {
let tests = [
TestCase(7, 8, (2, 2), (4, 5), vec!["########", "#......#", "#.######", "#..#...#", "#..##..#", "##.....#", "########"], 11),
TestCase(5, 8, (2, 2), (2, 4), vec!["########", "#.#....#", "#.###..#", "#......#", "########"], 10),
TestCase(50, 50, (2, 2), (49, 49), vec!["##################################################", "#................................................#", "#................................................#", "#................................................#", "#................................................#", "#................................................#", "#................................................#", "#................................................#", "#................................................#", "#................................................#", "#................................................#", "#................................................#", "#................................................#", "#................................................#", "#................................................#", "#................................................#", "#................................................#", "#................................................#", "#................................................#", "#................................................#", "#................................................#", "#................................................#", "#................................................#", "#................................................#", "#................................................#", "#................................................#", "#................................................#", "#................................................#", "#................................................#", "#................................................#", "#................................................#", "#................................................#", "#................................................#", "#................................................#", "#................................................#", "#................................................#", "#................................................#", "#................................................#", "#................................................#", "#................................................#", "#................................................#", "#................................................#", "#................................................#", "#................................................#", "#................................................#", "#................................................#", "#................................................#", "#................................................#", "#................................................#", "##################################################"], 94),
];

for TestCase(r, c, s, g, v, expected) in tests {
assert_eq!(run(r, c, s, g, v), expected);
}
}
}
```
</details>

### ARC031 B - 埋め立て

[B - 埋め立て](https://atcoder.jp/contests/arc031/tasks/arc031_2)(<span style="color: green">Difficulty : 1106</span>)
Expand Down Expand Up @@ -4391,6 +4560,8 @@ mod tests {
<summary>更新履歴</summary>

<ul class="history-list">
<li>2025年1月25日 : ABC269 <span style="color: brown">D - Do use hexagon grid</span>を追加</li>
<li>2025年1月16日 : ABC211 <span style="color: brown">D - Number of Shortest paths</span>を追加</li>
<li>2025年1月14日 : ABC088 <span style="color: green">D - Grid Repainting</span>を追加</li>
<li>2025年1月13日 : ABC016 <span style="color: green">C - 友達の友達</span>を追加</li>
<li>2025年1月12日 : ABC388 <span style="color: gray">C - Various Kagamimochi</span>を追加</li>
Expand Down
Loading

0 comments on commit fdd9efe

Please sign in to comment.