[PYTHON] AtCoder AGC 041 C - J'étais accro à la recherche complète de Domino Quality

Aperçu

--Il a fallu beaucoup de temps pour chercher comment placer Domino lorsque N = 7 et Qualité = 3. -Lors de l'implémentation de la recherche de $ 2 ^ {49} \ Fallingdotseq 10 ^ {15} $, vous devez bien élaguer les branches --Python est plus de 20 fois plus lent que C ++ dans certaines conditions

Lorsque vous recherchez comment placer N = 7 et Quality = 3 en python

Placez Domino de (0,0) et essayez-le. L'ordre d'essayer

  1. Orientation verticale
  2. Sur le côté
  3. Ne mettez pas

Il a fallu ** environ 740 [s] ** pour trouver un emplacement approprié.

findPattern.py


import sys
import numpy as np
import datetime

sys.setrecursionlimit(10 ** 7)


def cntQuality(N, grids, num, axis):
    q = 0

    if axis == 0:
        g = grids[num, :]
    else:
        g = grids[:, num]

    last = -1

    for i in range(N):
        d = g[i]

        if last == d or d == 0:
            continue

        q += 1
        last = d

    return q


def dfs(N, grids, pos, num, q):
    x = pos // N
    y = pos % N


    if y == 0 and x != 0:
        qx = cntQuality(N, grids, x-1, 0)
        if qx != q:
            return False

    # end grids
    if x == N and y == 0:
        # valid
        for i in range(N):
            qy = cntQuality(N, grids, i, 1)
            if qy != q:
                return False
        return grids

    # not yet
    pos += 1

    # put vertical
    if y < N-1 and grids[x][y] == 0 and grids[x][y+1] == 0:
        v_num = num + 1
        # v_grids = copy.copy(grids)
        grids[x][y] = v_num
        grids[x][y+1] = v_num
        g = dfs(N, grids, pos, v_num, q)
        if g is not False:
            return g
        grids[x][y] = 0
        grids[x][y+1] = 0

    # put horizontal
    if x < N-1 and grids[x][y] == 0 and grids[x+1][y] == 0:
        h_num = num + 1
        # h_grids = copy.copy(grids)
        grids[x][y] = h_num
        grids[x+1][y] = h_num
        g = dfs(N, grids, pos, h_num, q)
        if g is not False:
            return g
        grids[x][y] = 0
        grids[x+1][y] = 0

    # dont put domino
    g = dfs(N, grids, pos, num, q)
    if g is not False:
        return g

    return False


start = datetime.datetime.now()
print("start", start)


N = 7
q = 3
grids = np.zeros((N, N))
g = dfs(N, grids, 0, 0, q)
end = datetime.datetime.now()
print("end", end)

print(g)

Résultat d'exécution.txt


start 2020-01-07 18:13:18.477510
end 2020-01-07 18:22:35.768316
[[  1.   1.   2.   2.   3.   3.   0.]
 [  4.   4.   5.   5.   6.   0.   0.]
 [  7.   7.   0.   0.   6.   8.   8.]
 [  0.   0.   9.  10.   0.   0.  11.]
 [  0.   0.   9.  10.   0.   0.  11.]
 [  0.   0.   0.   0.  12.  13.  14.]
 [  0.   0.   0.   0.  12.  13.  14.]]

Pourquoi cela a-t-il coûté 740 [s]?

Il semble que l'ordre de recherche était mauvais.

  1. Sur le côté
  2. Orientation verticale
  3. Ne mettez pas

Lors de la recherche avec, l'arrangement a été trouvé dans un délai de 1 [s]. Peut-être que dans cet ordre de recherche, il y a des branches correspondantes à proximité.

J'ai essayé quelques modèles en Python et C ++

Ordre de recherche Python C++
côté->Verticale->Aucun 100[ms] 5[ms]
Verticale->côté->Aucun 740[s] 17[s]
Aucun->côté->Verticale 430[ms] 10[ms]

Conclusion

――Si vous ne pouvez pas bien tailler, il y aura un décalage horaire considérable en fonction de l'ordre de recherche. ――Il semble préférable d'utiliser C ++ que Python pour cette commande.

Recommended Posts

AtCoder AGC 041 C - J'étais accro à la recherche complète de Domino Quality
[Réparer] J'étais accro au jugement alphanumérique des chaînes Python
J'étais accro au multitraitement + psycopg2
Le record auquel j'étais accro en mettant MeCab dans Heroku
[Introduction à Python] J'ai comparé les conventions de nommage de C # et Python.
Une histoire sur l'écriture d'AWS Lambda et de devenir un peu accro aux valeurs par défaut des arguments Python
J'étais accro à Flask sur dotCloud
Le nom du fichier était mauvais en Python et j'étais accro à l'importation
Ce que j'étais accro à Python autorun
P100-PCIE-16GB a été ajouté au GPU de Google Colab avant que je le sache
L'inexactitude de Tensorflow était due à log (0)
[Introduction à json] Non, j'en étais accro. .. .. ♬
J'ai essayé de corriger la forme trapézoïdale de l'image
Je souhaite personnaliser l'apparence de zabbix
J'ai essayé de vectoriser les paroles de Hinatazaka 46!
linux / c> lien> Obtenir le résultat de l'exécution de la commande shell dans le programme C> On m'a appris à utiliser popen ()
Notez que j'étais accro au script npm ne passant pas dans l'environnement de vérification
AtCoder Beginner Contest 177 Problème C J'ai essayé de découvrir pourquoi c'était faux
Je veux grep le résultat de l'exécution de strace
J'ai essayé de résumer la forme de base de GPLVM
J'étais accro au grattage avec Selenium (+ Python) en 2020
Je veux bien comprendre les bases de Bokeh
Les performances de PHP étaient meilleures que ce à quoi je m'attendais
J'ai essayé de visualiser les informations spacha de VTuber
Une histoire à laquelle j'étais accro chez np.where
J'ai essayé d'effacer la partie négative de Meros
J'ai senti que j'avais porté le code Python en C ++ 98.
J'étais accro à essayer logging.getLogger avec Flask 1.1.x
Ce à quoi j'étais accro lors de l'utilisation de Python tornado
J'ai essayé de classer les voix des acteurs de la voix
Je souhaite augmenter la sécurité de la connexion SSH
J'ai essayé de résumer les opérations de chaîne de Python
J'ai essayé de réécrire le serveur WEB de la 1ère édition de programmation Linux normale avec C ++ 14
J'étais en charge de la maintenance du script Fabric, mais je ne sais pas.> <À ceux qui
Une histoire à laquelle j'étais accro en spécifiant nil comme argument de fonction dans Go
L'histoire quand j'étais accro à Caused by SSLError ("Impossible de se connecter à l'URL HTTPS car le module SSL n'est pas disponible.")
J'ai essayé de trouver l'entropie de l'image avec python
[Courses de chevaux] J'ai essayé de quantifier la force du cheval de course
J'ai essayé d'obtenir les informations de localisation du bus Odakyu
[IOS] Animation GIF avec Pythonista3. J'en étais accro.
Ce que j'ai fait pour accélérer la tâche de recherche de chaînes
Je souhaite utiliser uniquement le traitement de normalisation SudachiPy
Je veux obtenir des informations sur le fonctionnement de Yahoo Route
J'ai fait une fonction pour vérifier le modèle de DCGAN
J'ai essayé d'illustrer le temps et le temps du langage C
Ce à quoi j'étais accro lorsque l'utilisateur de traitement est passé à Python
[Python] J'ai essayé de visualiser la relation de suivi de Twitter
Je veux déterminer l'authenticité d'un élément du tableau numpy
[Apprentissage automatique] J'ai essayé de résumer la théorie d'Adaboost
Je veux connaître la nature de Python et pip
J'ai essayé de combattre le minimum local de la fonction Goldstein-Price
Keras Je veux obtenir la sortie de n'importe quelle couche !!
Je veux connaître la légende du monde des technologies informatiques
J'ai envoyé les données de Raspberry Pi à GCP (gratuit)
Notez que j'étais accro à accéder à la base de données avec mysql.connector de Python en utilisant une application Web