AtCoder ABC054 B - Template Matching
AtCoderに取り組んだ記録です。
AtCoder ProblemsのRecommendationsからピックアップして解いています。
問題ページはこちらです。
Point: 200
Difficulty: 828
考えたこと
左上から始点の画素を固定して、画像Bと全画素が一致するかをチェックすれば行けそうな気がします。制約もN, Mともに50以下なので間に合いそうです。
・画像Aの全画素について、左上から始点となる画素を決める
・決めた画素から、画像Bと同じ画像の面積(?)分の全画素が画像Bのものと一致するかをチェックする
・全画素が一致するものがみつかれば "Yes"、みつからなければ"No"
提出したコード
package main
import (
"bufio"
"fmt"
"os"
)
func main() {
r := bufio.NewReader(os.Stdin)
var n, m int
fmt.Fscan(r, &n)
fmt.Fscan(r, &m)
a := make([]string, n)
for i := 0; i < n; i++ {
fmt.Fscan(r, &a[i])
}
b := make([]string, m)
for i := 0; i < m; i++ {
fmt.Fscan(r, &b[i])
}
ans := false
for i := 0; i < n-m+1; i++ {
for j := 0; j < n-m+1; j++ {
if check(i, j, a, b) {
ans = true
break
}
}
}
if ans {
fmt.Println("Yes")
} else {
fmt.Println("No")
}
}
func check(startI, startJ int, a, b []string) bool {
result := true
for i := 0; i < len(b); i++ {
for j := 0; j < len(b); j++ {
if a[i+startI][j+startJ] != b[i][j] {
result = false
break
}
}
}
return result
}
感想など
・Difficultyに比べて少し易しい問題な印象
・解説に以下の計算量が記載されていた
全探索を行ったときの時間計算量は O(N2M2) となり、これは間に合います。
始点を決定するために、Nの2乗(縦*横)、画素のチェック処理にMの2乗(縦*横)が必要ということなのか。どうしてもふんわりとした理解で提出しがちです。が、このくらいわかりやすいものは、しっかりと計算量を把握した上で提出したいところ。。
・数式ってどうやってnoteにどうやって書くんだろうか。。調べないと
この記事が気に入ったらサポートをしてみませんか?