[PYTHON] AtCoder AGC 041 C - Ich war süchtig nach der vollständigen Suche nach Domino-Qualität

Überblick

Bei der Suche nach der Platzierung von N = 7 und Quality = 3 in Python

Platziere Domino von (0,0) und probiere es aus. Die Reihenfolge zu versuchen

  1. Vertikale Ausrichtung
  2. Seitwärts
  3. Nicht setzen

Es dauerte ** ungefähr 740 [s] **, um eine geeignete Platzierung zu finden.

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)

Ausführungsergebnis.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.]]

Warum hat es 740 [s] gekostet?

Es scheint, dass die Reihenfolge der Suche schlecht war.

  1. Seitwärts
  2. Vertikale Ausrichtung
  3. Nicht setzen

Bei der Suche mit wurde die Anordnung innerhalb von 1 [s] gefunden. Vielleicht gibt es in dieser Suchreihenfolge passende Filialen in der Nähe.

Ich habe einige Muster in Python und C ++ ausprobiert

Suchreihenfolge Python C++
Seite->Vertikal->Keiner 100[ms] 5[ms]
Vertikal->Seite->Keiner 740[s] 17[s]
Keiner->Seite->Vertikal 430[ms] 10[ms]

Fazit

――Wenn Sie nicht gut beschneiden können, gibt es je nach Suchreihenfolge einen erheblichen Zeitunterschied. ――Es scheint besser zu sein, C ++ als Python für diese Reihenfolge zu verwenden.

Recommended Posts

AtCoder AGC 041 C - Ich war süchtig nach der vollständigen Suche nach Domino-Qualität
[Fix] Ich war süchtig nach dem alphanumerischen Urteil über Python-Strings
Ich war süchtig nach Multiprocessing + Psycopg2
Die Platte, von der ich süchtig war, als ich MeCab in Heroku einsetzte
[Einführung in Python] Ich habe die Namenskonventionen von C # und Python verglichen.
Eine Geschichte über das Schreiben von AWS Lambda und ein wenig Abhängigkeit von den Standardwerten von Python-Argumenten
Ich war auf dotCloud süchtig nach Flask
Der Dateiname war in Python schlecht und ich war süchtig nach Import
Was ich süchtig nach Python Autorun war
P100-PCIE-16GB wurde der GPU von Google Colab hinzugefügt, bevor ich es wusste
Die Ungenauigkeit von Tensorflow war auf log (0) zurückzuführen.
[Einführung in json] Nein, ich war süchtig danach. .. .. ♬
Ich habe versucht, die Trapezform des Bildes zu korrigieren
Ich möchte das Erscheinungsbild von zabbix anpassen
Ich habe versucht, die Texte von Hinatazaka 46 zu vektorisieren!
linux / c> link> Ruft das Ausführungsergebnis des Shell-Befehls im C-Programm ab.> Mir wurde beigebracht, wie man popen () verwendet.
Beachten Sie, dass ich süchtig nach dem npm-Skript war, das in der Überprüfungsumgebung nicht übergeben wurde
AtCoder Beginner Contest 177 Problem C Ich habe versucht herauszufinden, warum es falsch war
Ich möchte das Ausführungsergebnis von strace erfassen
Ich habe versucht, die Grundform von GPLVM zusammenzufassen
Ich war süchtig danach, 2020 mit Selen (+ Python) zu kratzen
Ich möchte die Grundlagen von Bokeh vollständig verstehen
Die Leistung von PHP war besser als ich erwartet hatte
Ich habe versucht, die Spacha-Informationen von VTuber zu visualisieren
Eine Geschichte, von der ich bei np.where süchtig war
Ich habe versucht, den negativen Teil von Meros zu löschen
Ich hatte das Gefühl, dass ich den Python-Code nach C ++ 98 portiert habe.
Ich war süchtig danach, logging.getLogger mit Flask 1.1.x zu versuchen
Wovon ich süchtig war, als ich Python Tornado benutzte
Ich habe versucht, die Stimmen der Sprecher zu klassifizieren
Ich möchte die Sicherheit der SSH-Verbindung erhöhen
Ich habe versucht, die String-Operationen von Python zusammenzufassen
Ich habe versucht, den WEB-Server der normalen Linux-Programmierung 1st Edition mit C ++ 14 neu zu schreiben
Ich war für die Pflege des Fabric-Skripts verantwortlich, weiß es aber nicht.> <Für diejenigen, die
Eine Geschichte, nach der ich süchtig war, als ich in Go nil als Funktionsargument angab
Die Geschichte, als ich von Caused by SSLError abhängig war ("Kann keine Verbindung zur HTTPS-URL herstellen, da das SSL-Modul nicht verfügbar ist.")
Ich habe versucht, die Entropie des Bildes mit Python zu finden
[Pferderennen] Ich habe versucht, die Stärke des Rennpferdes zu quantifizieren
Ich habe versucht, die Standortinformationen des Odakyu-Busses zu erhalten
[IOS] GIF-Animation mit Pythonista3. Ich war süchtig danach.
Was ich getan habe, um die String-Suchaufgabe zu beschleunigen
Ich möchte nur die SudachiPy-Normalisierungsverarbeitung verwenden
Ich möchte Betriebsinformationen über die Yahoo-Route erhalten
Ich habe eine Funktion erstellt, um das Modell von DCGAN zu überprüfen
Ich habe versucht, die Zeit und die Zeit der C-Sprache zu veranschaulichen
Wovon ich süchtig war, als der Processing-Benutzer zu Python wechselte
[Python] Ich habe versucht, die folgende Beziehung von Twitter zu visualisieren
Ich möchte die Authentizität eines Elements eines numpy-Arrays bestimmen
[Maschinelles Lernen] Ich habe versucht, die Theorie von Adaboost zusammenzufassen
Ich möchte die Natur von Python und Pip kennenlernen
Ich habe versucht, das lokale Minimum der Goldstein-Preis-Funktion zu bekämpfen
Keras Ich möchte die Ausgabe einer beliebigen Ebene erhalten !!
Ich möchte die Legende der IT-Technologiewelt kennenlernen
Ich habe die Daten von Raspberry Pi an GCP gesendet (kostenlos)
Beachten Sie, dass ich süchtig danach war, mit Pythons mysql.connector über eine Webanwendung auf die Datenbank zuzugreifen