Что не так с моим Python кодом об этом алгоритме? - PullRequest
0 голосов
/ 07 марта 2020

Есть игра. У каждого человека есть клетчатая доска 10 * 10. Перед началом игры им нужно разместить три «самолета» на своей доске. Вопрос в том, сколько существует возможностей для размещения самолетов?

Это самолет.

enter image description here

Это два законных способа размещения самолетов. Размещение плоскости не может перекрываться, но может быть вставлено в зазор.

enter image description here

enter image description here

Мой код выглядит следующим образом:

class Plane():
    def __init__(self, x, y, direction):
        self.x = x
        self.y = y
        self.direction = direction
    @property
    def body(self):
        x = self.x
        y = self.y
        if self.direction == "up":
            return[(x-2, y-1), (x-1, y-1), (x, y-1),
                   (x+1, y-1), (x+2, y-1), (x, y-2),
                   (x-1, y-3), (x, y-3), (x+1, y-3)]
        elif self.direction == "down":
            return[(x-2, y+1), (x-1, y+1), (x, y+1),
                   (x+1, y+1), (x+2, y+1), (x, y+2),
                   (x-1, y+3), (x, y+3), (x+1, y+3)]
        elif self.direction == "left":
            return[(x+1, y+2), (x+1, y+1), (x+1, y),
                   (x+1, y-1), (x+1, y-2), (x+2, y),
                   (x+3, y+1), (x+3, y), (x+3, y-1)]
        elif self.direction == "right":
            return[(x-1, y+2), (x-1, y+1), (x-1, y),
                   (x-1, y-1), (x-1, y-2), (x-2, y),
                   (x-3, y+1), (x-3, y), (x-3, y-1)]
    @property
    def check(self):
        global chart
        for x in self.body:
            if x[0]<0 or x[0]>9 or x[1]<0 or x[1]>9 or chart[x[0]][x[1]] != 0:
                return False
        return True

def recursion(plane):
    global chart, plane_list
    if plane.check:
        x = plane.x
        y = plane.y
        plane_list.append(plane)
        chart[x][y] = 2
        for j in plane.body:
            chart[j[0]][j[1]] = 1
        if x!= 9:
            find_plane(x+1, y)
        else:
            find_plane(0, y+1)
        plane_list.remove(plane)
        chart[x][y] = 0
        for j in plane.body:
            chart[j[0]][j[1]] = 0

def find_plane(startx, starty):
    global method_list, chart, plane_list
    if len(plane_list) == 3:
        method_list.append(plane_list)
        return
    if startx == 9 and starty == 9:
        return
    for x in range(10):
        for y in range(10):
            if (x > startx or y > starty) and (chart[x][y] == 0):
                recursion(Plane(x, y, "up"))
                recursion(Plane(x, y, "down"))
                recursion(Plane(x, y, "left"))
                recursion(Plane(x, y, "right"))

if __name__ == "__main__":
    method_list = []
    chart = [[0]*10 for i in [0]*10]
    plane_list = []
    find_plane(0, 0)
    print(method_list)

У меня проблемы:

  1. Наконец-то я получил method_list:

enter image description here

Скриншот здесь не полный. Фактически, method_list состоит из 174631 []. Это меня сильно озадачило, потому что мой код logi c заключается в том, что только когда длина списка плоскостей равна 3, plane_list будет добавлен в method_list. Я не понял, почему method_list состоит из нескольких пустых списков.

Мой ответ 174631 неверен. Я искал Inte rnet для этой проблемы и нашел эту статью (китайский). https://blog.csdn.net/GGN_2015/article/details/91295002

Перевод: После DFS мы обнаружили, что в игре с бомбардировкой 9 * 9 есть 8744 схемы размещения. Если размер шахматной доски равен 10 × 10, общее число схем составляет 66816.

Но мой ответ несколько раз равен 66816. Я долго думал об алгоритме и до сих пор не Знай, где я не прав. Надеюсь получить ответ.

1 Ответ

1 голос
/ 08 марта 2020

Я провожу некоторое время и получаю 66816. Я постараюсь ответить:

1. Весь ваш method_list это список ссылок на один список - plane_list. Когда plane_list пусто, тогда все элементы method_list пусты ... и plane_list пусто, потому что вы удалили все элементы. Вам следует заменить method_list.append(plane_list) на method_list.append(plane_list.copy()).

2. У вас действительно плохая логика c за этим кодом:

    if x!= 9:
        find_plane(x+1, y)
    else:
        find_plane(0, y+1)

Я понимаю, что вы пытаетесь сделать здесь, но вы делаете это неправильно. Так что ... не делай этого. Не пытайтесь иметь какой-то порядок в plane_list. просто сделайте это:

find_plane(0, 0)

тогда у вас будут дубликаты в method_list: плоскости могут быть в таких порядках: (0, 1, 2), (0, 2, 1), (1, 0 , 2), (1, 2, 0), (2, 0, 1), (2, 1, 0). есть 6 копий той же позиции. Итак ... вы должны разделить len (method_list) на 6.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...