AtCoder Beginner Contest B - Template Matching Difficulty: 828
Ce thème, le calcul matriciel
C'est un tableau à deux dimensions, mais l'utilisation d'une bibliothèque de matrices peut faciliter les opérations. Ruby
ruby.rb
require 'matrix'
class Matrix
# v2.Ne peut pas être attribué en 3
def []=(i, j, x)
@rows[i][j]=x
end
end
n, m = gets.split.map(&:to_i)
rows = Array.new(n + m){gets.chomp.chars.map{|c| (c == '#') ? 1 : 0}}
a = Matrix.rows(rows.shift(n))
b = Matrix.rows(rows)
(n - m + 1).times do |i|
(n - m + 1).times do |j|
if a.minor(i, m, j, m) == b
puts "Yes"
exit
end
end
end
puts "No"
matrix.rb
require 'matrix'
class Matrix
# v2.Ne peut pas être attribué en 3
def []=(i, j, x)
@rows[i][j]=x
end
end
Appelez la bibliothèque de matrices avec require'matrix'.
Dans l'environnement local v2.7.1, il peut être affecté aux éléments de la matrice, mais dans l'environnement AtCoder v2.3.3, il ne peut pas être attribué, donc une méthode est ajoutée.
La chose intéressante à propos de ** Ruby ** est que vous pouvez également le faire pour les bibliothèques standard.
minor.rb
if a.minor(i, m, j, m) == b
La sous-matrice est acquise par «mineur» et la matrice est comparée.
error.rb
(n - m).times do |i|
(n - m).times do |j|
(n - m + 1).times do |i|
(n - m + 1).times do |j|
Lorsque la matrice est ~~ "1 x 1", la comparaison des matrices ne se passe pas bien, donc le traitement correspondant est inclus. ~~ (n --m) était faux et (n --m + 1) était correct.
** Addenda ** Veuillez vous référer à la section des commentaires pour la version de tableau bidimensionnel. Python
import numpy
n, m = map(int, input().split())
a = numpy.zeros([n, n], dtype=int)
b = numpy.zeros([m, m], dtype=int)
for i in range(n):
s = input()
for j in range(n):
if s[j] == '#':
a[i, j] = 1
for i in range(m):
s = input()
for j in range(m):
if s[j] == '#':
b[i, j] = 1
for i in range(n - m + 1):
for j in range(n - m + 1):
if numpy.all(a[i: i + m, j: j + m] == b):
print("Yes")
exit()
print("No")
all.py
if numpy.all(a[i: i + m, j: j + m] == b):
La comparaison de matrices numpy renvoie, par exemple, «[[True, True], [True, True]]», nous utilisons donc la fonction all pour vérifier si elles sont toutes «True».
| Ruby (Matrix) | Ruby (Array) | Python (numpy) | |
|---|---|---|---|
| Longueur du code(Byte) | 420 | 288 | 534 |
| Temps d'exécution(ms) | 22 | 10 | 166 |
| Mémoire(KB) | 3196 | 1788 | 12512 |
Recommended Posts