Résolution avec Ruby, Perl, Java et Python AtCoder AGC 033 A Recherche de priorité de largeur

introduction

Ce thème

AtCoder Grand Contest 033 A - Darker and Darker Difficulty: 1245

Ce thème, recherche de priorité de largeur Ruby Ceci est une version avancée du * [Concours typique AtCoder 002 A --Width Priority Search] précédemment résolu (https://atcoder.jp/contests/atc002/tasks/abc007_3) *. En particulier, il a une condition stricte de «délai d'exécution: 1 sec».

ruby.rb


h, w = gets.split.map(&:to_i)
cm = Array.new(h + 2){Array.new(w + 2, 0)}
que = []
1.upto(h) do |i|
  s = gets.chomp
  1.upto(w) do |j|
    if s[j - 1] == '.'
      cm[i][j] = -1
    else
      que.push(i)
      que.push(j)
    end
  end
end
ans = 0
while que.size > 0
  y = que.shift
  x = que.shift
  ans = cm[y][x] + 1
  if cm[y + 1][x] == -1
    cm[y + 1][x] = ans
    que.push(y + 1)
    que.push(x)
  end
  if cm[y - 1][x] == -1
    cm[y - 1][x] = ans
    que.push(y - 1)
    que.push(x)
  end
  if cm[y][x + 1] == -1
    cm[y][x + 1] = ans
    que.push(y)
    que.push(x + 1)
  end
  if cm[y][x - 1] == -1
    cm[y][x - 1] = ans
    que.push(y)
    que.push(x - 1)
  end
end
puts ans - 1

array.rb


cm = Array.new(h + 2){Array.new(w + 2, 0)}

Lors de la vérification vers le haut, le bas, la gauche et la droite, la disposition est agrandie afin que vous n'obteniez pas d'erreur avec nil.

push.rb


h, w = gets.split.map(&:to_i)
cm = Array.new(h + 2){Array.new(w + 2, 0)}
que = []
1.upto(h) do |i|
  s = gets.chomp
  1.upto(w) do |j|
    if s[j - 1] == '.'
      cm[i][j] = -1
    else
      que << i << j
      cm[i][j] = 0
    end
  end
end
ans = 0
while que.size > 0
  y = que.shift
  x = que.shift
  ans = cm[y][x] + 1
  if cm[y + 1][x] == -1
    cm[y + 1][x] = ans
    que << y + 1 << x
  end
  if cm[y - 1][x] == -1
    cm[y - 1][x] = ans
    que << y - 1 << x
  end
  if cm[y][x + 1] == -1
    cm[y][x + 1] = ans
    que << y << x + 1
  end
  if cm[y][x - 1] == -1
    cm[y][x - 1] = ans
    que << y << x - 1
  end
end
puts ans - 1

Ce code utilise «<<» au lieu du «push» que vous avez reçu dans les commentaires. Ici, le temps d'exécution est raccourci. Python

  • Python * était TLE cette fois. En regardant les réponses d'autres concurrents, il existe de nombreux exemples d'utilisation de «numpy».

cmd.exe


C:\Users\user>pacman -S mingw-w64-x86_64-python-numpy

Je l'ai installé immédiatement.

** Addenda ** Je suis passé par PyPy.

PyPy.py


from collections import deque

h, w = map(int, input().split())
cm = [[0 for j in range(w + 2)] for i in range(h + 2)]
que = deque([])
for i in range(1, h + 1):
    s = input()
    for j in range(1, w + 1):
        if s[j - 1] == ".":
            cm[i][j] = -1
        else:
            que.append(i)
            que.append(j)
ans = 0
while len(que) > 0:
    y = que.popleft()
    x = que.popleft()
    ans = cm[y][x] + 1
    if cm[y + 1][x] == -1:
        cm[y + 1][x] = ans
        que.append(y + 1)
        que.append(x)
    if cm[y - 1][x] == -1:
        cm[y - 1][x] = ans
        que.append(y - 1)
        que.append(x)
    if cm[y][x + 1] == -1:
        cm[y][x + 1] = ans
        que.append(y)
        que.append(x + 1)
    if cm[y][x - 1] == -1:
        cm[y][x - 1] = ans
        que.append(y)
        que.append(x - 1)
print(ans - 1)

Perl

  • Perl * était «TLE» cette fois. En regardant les réponses des autres concurrents. .. .. Il n'y a pas de réponse correcte.

Java Cette fois, c'est un double stand. Le premier est une copie de * code précédent * avec quelques modifications.

java.java


import java.util.*;

class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int h = Integer.parseInt(sc.next());
        int w = Integer.parseInt(sc.next());
        int cm[][] = new int[h + 2][w + 2];
        Deque<Integer> que = new ArrayDeque<>();
        for (int i = 1; i <= h; i++) {
            String s = sc.next();
            for (int j = 1; j <= w; j++) {
                if (".".equals(s.substring(j - 1, j))) {
                    cm[i][j] = -1;
                } else {
                    que.add(i);
                    que.add(j);
                }
            }
        }
        sc.close();
        int ans = 0;
        while (que.size() > 0) {
            int y = que.poll();
            int x = que.poll();
            ans = cm[y][x] + 1;
            if (cm[y + 1][x] == -1) {
                cm[y + 1][x] = ans;
                que.add(y + 1);
                que.add(x);
            }
            if (cm[y - 1][x] == -1) {
                cm[y - 1][x] = ans;
                que.add(y - 1);
                que.add(x);
            }
            if (cm[y][x + 1] == -1) {
                cm[y][x + 1] = ans;
                que.add(y);
                que.add(x + 1);
            }
            if (cm[y][x - 1] == -1) {
                cm[y][x - 1] = ans;
                que.add(y);
                que.add(x - 1);
            }
        }
        System.out.println(ans - 1);
    }
}

array.java


        int cm[][] = new int[h + 2][w + 2];

Lors de la vérification vers le haut, le bas, la gauche et la droite, le tableau est agrandi pour ne pas obtenir ʻArrayIndexOutOfBoundsException`.

class.java


import java.util.*;

class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int h = Integer.parseInt(sc.next());
        int w = Integer.parseInt(sc.next());
        int s[][] = new int[h + 2][w + 2];
        Queue<Pair> que = new ArrayDeque<>();
        for (int i = 1; i <= h; i++) {
            char c[] = sc.next().toCharArray();
            for (int j = 1; j <= w; j++) {
                if (c[j - 1] == '.') {
                    s[i][j] = -1;
                } else {
                    que.add(new Pair(i, j));
                }

            }
        }
        sc.close();

        Pair p;
        int ans = 0;
        while (!que.isEmpty()) {
            p = que.poll();
            ans = s[p.x][p.y] + 1;
            if (s[p.x + 1][p.y] == -1) {
                s[p.x + 1][p.y] = ans;
                que.add(new Pair(p.x + 1, p.y));
            }
            if (s[p.x - 1][p.y] == -1) {
                s[p.x - 1][p.y] = ans;
                que.add(new Pair(p.x - 1, p.y));
            }
            if (s[p.x][p.y + 1] == -1) {
                s[p.x][p.y + 1] = ans;
                que.add(new Pair(p.x, p.y + 1));
            }
            if (s[p.x][p.y - 1] == -1) {
                s[p.x][p.y - 1] = ans;
                que.add(new Pair(p.x, p.y - 1));
            }
        }
        System.out.println(ans - 1);
    }
}

class Pair {
    int x;
    int y;

    public Pair(int x, int y) {
        this.x = x;
        this.y = y;
    }
}

ArrayDeque semble être lent, donc je génère une classe et la passe pour chaque classe afin de réduire les entrées et les sorties.

  • Java * était un enfant qui pouvait le faire.
Ruby Ruby(<<) Python PyPy Perl Java Java(class)
Longueur du code(Byte) 753 676 878 878 777 1511 1580
Temps d'exécution(ms) 843 801 TLE 599 TLE 779 345
Mémoire(KB) 27132 27132 52484 37692 174720 114932 70740

Résumé

  • Résolu AGC 033 A
  • Familiarisez-vous avec Ruby
  • Numpy installé
  • Java était un enfant capable

Site référencé

Recommended Posts

Résolution avec Ruby, Perl, Java et Python AtCoder AGC 033 A Recherche de priorité de largeur
Résolution avec Ruby, Perl, Java et Python AtCoder ATC 002 A
Résolution avec Ruby et Python AtCoder ABC151 D Recherche de priorité de largeur
Résolution avec Ruby, Perl, Java et Python AtCoder ATC 002 B
Résolution avec Ruby, Perl, Java et Python AtCoder ABC 065 C-th power
Résolution avec Ruby, Perl, Java et Python AtCoder ABC 107 B Manipulation de chaînes
Résolution avec Ruby, Perl, Java et Python AtCoder ARC 098 C Somme cumulative
Résolution avec Ruby, Perl, Java et Python AtCoder CADDi 2018 C factorisation premier
AtCoder ABC 165 D Floor Function résolue en Ruby, Perl, Java et Python
Résolution avec Ruby, Perl, Java et Python AtCoder ABC 131 D Tri des tableaux
Résolution avec Ruby, Perl, Java et Python AtCoder Diverta 2019 Concours de programmation Manipulation de chaînes C
Résolution avec Ruby et Python AtCoder ABC057 C Décomposition du facteur premier Recherche complète de bits
Résolution avec Ruby, Perl, Java et Python AtCoder ABC 047 C Expression régulière
Résolution avec Ruby, Perl, Java et Python AtCoder ARC 066 C Hash carré itératif
Résolution avec Ruby et Python AtCoder ARC 059 C Méthode du carré minimum
Résolution avec Ruby et Python AtCoder ABC178 D Méthode de planification dynamique
Résolution avec Ruby et Python AtCoder AISING2020 D Méthode carrée itérative
Résolution avec Ruby et Python AtCoder ABC011 C Méthode de planification dynamique
Résolution avec Ruby et Python AtCoder ABC153 E Méthode de planification dynamique
Résolution avec Ruby et Python AtCoder ARC067 C factorisation premier
Résolution avec Ruby et Python AtCoder ABC138 D Liste adjacente
Résolution en Ruby, Python et Java AtCoder ABC141 D Priority Queue
AtCoder ARC104 B Somme cumulative résolue en Ruby, Python et Java
Résolution avec Ruby, Python et numpy AtCoder ABC054 B Calcul de la matrice
Résolution avec Ruby, Python et networkx AtCoder ABC168 D Liste adjacente
Résolution avec Ruby et Python AtCoder Tenka1 Programmer Contest C Somme cumulative
Résolution avec Ruby, Perl, Java et Python AtCoder ARC 086 C Hash Sorting
Résolution avec Ruby et Python AtCoder CODE FESTIVAL 2016 qual C B Priority Queue
[Python] Recherche de priorité de profondeur et recherche de priorité de largeur
AtCoder ABC168 Une expression de cas résolue en Ruby et Python
Scraping avec Node, Ruby et Python
Répertorier les chaînes de fractionnement et de jointure avec fractionnement et jointure (Perl / PowerShell / Java / Kotlin / Python)
Un mémo contenant Python2.7 et Python3 dans CentOS
Rechercher le labyrinthe avec l'algorithme python A *
[AtCoder] Résoudre ABC1 ~ 100 Un problème avec Python
Résoudre AtCoder ABC168 avec python (A ~ D)
Crypter avec Ruby (Rails) et décrypter avec Python
Scraping Web facile avec Python et Ruby
Résoudre avec Python [100 questions passées que les débutants et les intermédiaires devraient résoudre] (028 --033 recherche de priorité de largeur)
AtCoder ABC130 D Dichotomie de la somme cumulée résolue par Ruby et Python
Résolution avec Ruby et Python AtCoder ABC172 C Dichotomie de somme cumulée
MessagePack-Try pour lier Java et Python avec RPC
Raisonnement causal et recherche causale par Python (pour les débutants)
Construire un environnement python avec virtualenv et direnv
Résoudre avec Ruby et Python AtCoder ABC084 D Somme cumulative des nombres premiers
J'ai écrit une classe en Python3 et Java
Pourquoi je suis une boutique Java et démarre Python
Lancer un serveur Web avec Python et Flask
Résolution du modèle Lorenz 96 avec Julia et Python
Manipulation de chaîne C AtCoder ABC110 à résoudre dans Ruby
Défiez AtCoder (ABC) 164 avec Python! Un problème ~ C
Tendances 2014 du cadre d'application Web (PHP / Java / Ruby / Python / Perl)
Simulation AtCoder ARC080 D résolue avec Ruby et Python
Créez un environnement virtuel python avec virtualenv et virtualenvwrapper
Benchmarks langage C, Java, Python avec factorisation prime
Essayez de créer un jeu simple avec Python 3 et iPhone
Exploration avec Python et Twitter API 1 - Fonction de recherche simple
J'ai essayé de faire LINE BOT avec Python et Heroku
Créez un environnement virtuel python avec virtualenv et virtualenvwrapper
Étudiez l'échange de données Java et Python avec Apache Arrow
Implémenter la recherche de priorité en profondeur (DFS) et la recherche de priorité de largeur (BFS) en python