Résolvez 100 questions passées que les débutants et les intermédiaires devraient résoudre en Python. L'objectif est de devenir bleu clair lorsque vous avez terminé de tout résoudre.
Cet article s'intitule "015 --017 Recherche complète: Recherche complète en avant".
Dans de nombreux cas, il peut être résolu en utilisant bien itertools pour les problèmes séquentiels.
permutaionsQuandcombinationQuandproductJe l'utilise beaucoup, j'ai donc appris ce domaine en essayant divers exemples de données.
N = int(input())
towns = [tuple(map(int, input().split())) for _ in range(N)]
total_distance = 0
count = 0
for start in range(N-1):
    for end in range(start+1, N):
        start_x, start_y = towns[start]
        end_x, end_y = towns[end]
        total_distance += ((end_x - start_x)**2 + (end_y - start_y)**2)**0.5
        count += 1
# factor = math.factorial(N)Puis
# answer = total_distance * (factor * (N - 1) / count) /Cela devient un facteur et la formule peut être transformée comme suit
answer = total_distance * ((N - 1) / count)
print(answer)
Il existe différentes méthodes de calcul ici. Pour être honnête, j'énumère tous les arrangements avec `` permutation '', je trouve la distance en tout, et je prends la moyenne. Je pense que cela fonctionnera toujours, mais je l'ai essayé comme réponse avec un peu moins de calcul. La politique est
est Le 2 ci-dessus est dérivé de la transformation d'expression laissée en commentaire dans le code.
import itertools
N = int(input())
P = tuple(map(int, input().split()))
Q = tuple(map(int, input().split()))
count = 1
for p in itertools.permutations(range(1, N+1)):
    if p == P:
        count_P = count
    if p == Q:
        count_Q = count
    count += 1
ans = abs(count_P - count_Q)
print(ans)
Croyez que les itertools.permutations de python les listeront dans l'ordre lexical (!) Je vais l'écrire honnêtement.
La politique est
itertools.permutationscount_P``` et `count_Q``` où P et Q correspondent.est.
itertoolsSi vous n'en avez pas, vous devrez réfléchir un peu plus, mais c'est pratique, alors je l'ai utilisé sans réfléchir.

import itertools
import copy
def flag_queen_load(grid, r, c):
    for i in range(1, 8):
        if 0 <= c+i and c+i < 8:
            grid[r][c+i] = -1 #droite
        if 0 <= c-i and c-i < 8:  
            grid[r][c-i] = -1 #la gauche
        if 0 <= r+i and r+i < 8:  
            grid[r+i][c] = -1 #en dessous de
        if 0 <= r-i and r-i < 8:
            grid[r-i][c] = -1 #Vers le haut
        if 0 <= r-i and r-i < 8 and 0 <= c+i and c+i < 8:
            if grid[r-i][c+i] == 9:
                continue
            grid[r-i][c+i] = -1 #En haut à droite
        if 0 <= r+i and r+i < 8 and 0 <= c+i and c+i < 8:
            if grid[r+i][c+i] == 9:
                continue
            grid[r+i][c+i] = -1 #En bas à droite
        if 0 <= r+i and r+i < 8 and 0 <= c-i and c-i < 8:  
            if grid[r+i][c-i]  == 9:
                continue
            grid[r+i][c-i] = -1 #En bas à gauche
        if 0 <= r-i and r-i < 8 and 0 <= c-i and c-i < 8:
            if grid[r-i][c-i] == 9:
                continue
            grid[r-i][c-i] = -1 #en haut à gauche
    grid[r][c] = 9 #moi même
    return grid
if __name__ == "__main__":
    k = int(input())
    grid = [[0] * 8 for _ in range(8)]
    for _ in range(k):
        r, c = map(int, input().split())
        grid = flag_queen_load(grid, r, c)
    # 0~Essayez le numéro 7 à travers la séquence
    #Pour la séquence générée, considérez l'indice comme le numéro de ligne et l'élément comme le numéro de colonne.
    for perm in itertools.permutations(range(8)):
        copy_grid = copy.deepcopy(grid) #Utilisez une nouvelle grille à chaque fois
        count = 0
        for row, col in enumerate(perm):
            if copy_grid[row][col] == -1:
                break
            if copy_grid[row][col] == 9:
                continue
            
            copy_grid[row][col] = 9
            copy_grid = flag_queen_load(copy_grid, row, col)
            count += 1
        if count == 8 - k: # 8-casse si tu mets k reines
            break
    
    #Affichage des réponses
    for row in range(8):
        for col in range(8):
            if copy_grid[row][col] == -1:
                print('.', end='')
            else:
                print('Q', end='')
        print()
À l'origine, je l'ai écrit dans Numpy, mais AOJ ne peut-il pas utiliser Numpy? Je n'ai pas pu le soumettre en raison d'une erreur, je l'ai donc réécrit avec une liste normale. La politique est
`flag_queen_load ()` qui met à jour le tableau lorsqu'une reine est placée à une certaine coordonnée (r, c) .break```, et s'il est 9, c'est OK, donc `continue```est.
La fonction `` flag_queen_load () '' est sale, donc j'aurais dû l'écrire un peu plus propre.
Recommended Posts