Le plus grand carré d'une grille [fermé]

10

Défi

Étant donné une grille comme celle-ci,

  1 2 3 4 5 6 7 8
1 . . . . . . . .
2 . # . . . # . .
3 . . . . . . . .
4 . . . . . . . .
5 . . . . . . . .
6 . . # . . . . .
7 . . . . . . . .
8 . . . . . . . .

écrire un morceau de code qui peut déterminer la taille du plus grand carré qui n'inclut pas de «#». (La réponse à cette entrée est 5x5 car la grille en bas à droite 5x5 est le plus grand carré possible).

Le carré doit avoir des côtés parallèles aux axes x et y.

Comme quelques petits détails: la grille d'origine est toujours un carré et sa longueur latérale vous est donnée. Les coordonnées des symboles «#» vous sont également données.

Détails d'entrée

Première ligne: N (1 <= N <= 1000), la longueur du côté de la grille carrée, et T (1 <= T <= 10 000) le nombre de signes «#».

Lignes T suivantes: les coordonnées de chacun des T #

Cas de test

Entrée # 1:

8 3
2 2
2 6
6 3

Résultat # 1: 5

================

Entrée # 2:

8 4
1 1
1 8
8 1
8 8

Résultat # 2: 6

================

Entrée # 3:

5 1
3 3

Résultat # 3: 2

C'est un problème de le plus rapide, donc le code le plus rapide testé sur le compilateur de rextester gagne.

S'amuser!

NL628
la source
1
Connexes .
user202729
3
Pour fastest-code1000x1000, c'est trop petit, cependant
l4m2 le
1
Mais rextester ne prend pas en charge Jelly ou Hexagony.
user202729
6
Aussi performant que soit le rextester, puis-je recommander plutôt de l' essayer en ligne ? Il contient beaucoup plus de langages et est géré par la communauté.
ATaco
1
"le code le plus rapide testé sur le compilateur rextester gagne" - le plus rapide sur quelle entrée?
Nathaniel

Réponses:

1

Node.js

Prend l'entrée comme (w, l) , où w est la largeur et l est un tableau de coordonnées [x, y] . (Cela peut être modifié si le format d'entrée est vraiment aussi strict que décrit.) Fonctionne en O (w²) .

f = (w, l) => {
  var x, y,
      W = w * w,
      a = new Uint16Array(W),
      best = 0;

  l.forEach(([x, y]) => a[(y - 1) * w + x - 1] = 1);

  for(y = w; y < W; y += w) {
    for(x = y + 1; x < y + w; x++) {
      if(a[x]) {
        a[x] = 0;
      }
      else {
        best = Math.max(
          best,
          a[x] = Math.min(a[x - 1], a[x - w], a[x - w - 1]) + 1
        );
      }
    }
  }

  return best;
}

Essayez-le en ligne!

Arnauld
la source
console.log(f( 1000, [...Array(10000)].map(_=>[Math.random()*1000+1|0,Math.random()*1000+1|0]) )); coûte 114 ms, bien que ce soit la faible efficacité de la langue
l4m2
Cela ressemble plus à 8 ms à l'intérieur de f () après la compilation JIT. (Mais oui ... les réponses ne seront pas notées de cette façon.)
Arnauld
Je doute que l'OP ajoute un critère de gain plus objectif ...
user202729
1

C (gcc)

Pas d'algorithme sophistiqué ici, juste presque de la force brute ... mais bon, C est rapide.

Entrée: prend l'entrée de stdin .

Sortie: écrit la sortie sur stdout .

#include <stdio.h>
#include <stdint.h>

int main(void) {
    uint_fast16_t n, t, i, j, h, x, y, flag, biggest = 0;
    scanf("%hi %hi", &n, &t);
    uint_fast8_t m[n][n];
    for (uint_fast16_t c = 0; c < t; ++c) {
        scanf("%hi %hi", &i, &j);
        m[i-1][j-1] = '#';
    }
    for (i = 0; i < n - 1; ++i) {
        for (j = 0; j < n - 1; ++j) {
            flag = 1;
            for (h = 1; flag && i + h < n + 1 && j + h < n + 1; ++h) {
                for (y = i; flag && y < i + h; ++y) {
                    for (x = j; flag && x < j + h; ++x) {
                        if (m[y][x] == '#') flag = 0;
                    }
                }
                if (flag && h > biggest) biggest = h;
            }
        }
    }
    printf("%d", biggest);
}

Essayez-le en ligne!

Marco
la source