2023-10-31 ABC326 D を解いた
Slay the Spire A15H を終了した。ただ心臓で負けてしまったので素直には喜べない。
子どもがハロウィンで先生の仮装 (かぶりもの) に大泣きしたらしい。いつも妻が「お化けを呼ぶよ」なんて言い続けているせいでは……と思ったが怖いので言わない。
パナソニックグループ プログラミングコンテスト2023(AtCoder Beginner Contest 326)
- D - ABC Puzzle
https://atcoder.jp/contests/abc326/tasks/abc326_d
- 提出: https://atcoder.jp/contests/abc326/submissions/47099086
- 7WA
- "ABC.." の next_permutation のうち条件を満たすものだけにうまく枝刈りすれば間に合う
- next_permutation を呼び出さずに continue して無限ループしたり、状態のリセットを誤ったり、 N = 3, 4 のケースを忘れて "ABC.." に固定したりいろいろやってしまった
use proconio::{input, marker::Chars};
use superslice::Ext;
fn g(ans: &mut [Vec<char>], n: usize, capital_r: &[char], capital_c: &[char], r: usize) -> bool {
for (capital_r_i, ans_i) in capital_r.iter().copied().zip(ans.iter()).take(r) {
match ans_i.iter().copied().find(|c| c != &'.') {
None => return false,
Some(first) => {
if first != capital_r_i {
return false;
}
}
}
}
for (j, capital_c_j) in capital_c.iter().copied().enumerate() {
match (0..r).map(|i| ans[i][j]).find(|c| c != &'.') {
None => {
if r == n {
return false;
}
}
Some(first) => {
if first != capital_c_j {
return false;
}
}
}
let count =
(0..r)
.map(|i| ans[i][j])
.filter(|c| c != &'.')
.fold(vec![0; 3], |mut count, c| {
count[(c as u8 - b'A') as usize] += 1;
count
});
if r == n {
if count != vec![1; 3] {
return false;
}
} else if count.iter().any(|c| c > &1) {
return false;
}
}
true
}
fn f(ans: &mut Vec<Vec<char>>, n: usize, capital_r: &[char], capital_c: &[char], r: usize) -> bool {
if r == n {
return g(ans, n, capital_r, capital_c, r);
}
for ans_i in ans.iter_mut().skip(r) {
ans_i.sort();
}
loop {
if g(ans, n, capital_r, capital_c, r + 1) && f(ans, n, capital_r, capital_c, r + 1) {
return true;
}
if !ans[r].next_permutation() {
break;
}
}
false
}
fn main() {
input! {
n: usize,
capital_r: Chars,
capital_c: Chars,
};
let mut ans = vec![];
for _ in 0..n {
let chars = "ABC..".chars().take(n).collect::<Vec<char>>();
ans.push(chars);
}
if f(&mut ans, n, &capital_r, &capital_c, 0) {
println!("Yes");
for ans_i in ans.iter() {
for ans_ij in ans_i.iter() {
print!("{}", ans_ij);
}
println!();
}
} else {
println!("No");
}
}
今日のコミット。
- kireta 1 commit
- rust-atcoder 1 commit