Найти - Пользователи
Полная версия: Ханойские башни
Начало » Python для новичков » Ханойские башни
1 2
Alex9
# -*- coding: utf-8 -*-
import sys
 
if len(sys.argv) > 3:
    print "error"
    sys.exit(1)
 
n = int(sys.argv[1])
if len(sys.argv) == 3 and sys.argv[2] == "-v":
    f = 1
else:
    f = 0
 
class Hanoi:
    def move(self, a, b, c, n):
        if n == 1:
            c.append(a[0])
            del a[0]
            if f == 1:    display(a, b, c)
        else:
            move(a, c, b, n - 1)
            c.append(a[0])
            del a[0]
            if f == 1:    display(a, b, c)
            move(b, a, c, n - 1)
    def __init__(self, n):
        if n > 0:
            a = []
            for i in range(n):
                a.append(i)
            b = []
            c = []
            move(a, b, c, n)    
    def display(self, a, b, c):
        print u"1: ",
        for i in len(a):
            print a[i - 1] + ' ',
        print ""
        print u"1: ",
        for i in len(b):
            print a[i - 1] + ' ',
        print ""
        print u"1: ",
        for i in len(c):
            print a[i - 1] + ' ',
        print ""
 
x = Hanoi(n)
 
del x
 
sys.exit(u"Complete")

Выдает ошибки в строках 48 и 33.
lorien
Попробуйте исправить ошибки.
Alex9
Мне кажется, ошибка связана с использованием self.
Alex9
# -*- coding: utf-8 -*-
import sys
class Hanoi:
    def move(self, a, b, c, n):
        if n == 1:
            c.append(a[0])
            del a[0]
            if f == 1:    self.display(a, b, c)
        else:
            self.move(a, c, b, n - 1)
            c.append(a[0])
            del a[0]
            if f == 1:    self.display(a, b, c)
            self.move(b, a, c, n - 1)
    def __init__(self, n):
        if n > 0:
            self.a = []
            for i in range(n):
                self.a.append(i)
            self.b = []
            self.c = []
            self.n = n
            self.move(self.a, self.b, self.c, self.n)    
    def display(self, a, b, c):
        print u"1: ",
        for i in range(len(a)):
            print str(a[i - 1]) + ' ',
        print ""
        print u"2: ",
        for i in range(len(b)):
            print str(b[i - 1]) + ' ',
        print ""
        print u"3: ",
        for i in range(len(c)):
            print str(c[i - 1]) + ' ',
        print ""
if len(sys.argv) > 3:
    print "error"
    sys.exit(1)
f = 0 
n = int(sys.argv[1])
if len(sys.argv) == 3 and sys.argv[2] == "-v":
    f = 1
 
x = Hanoi(n)
del x
sys.exit(u"Complete")
Теперь программа работает, но решение неверно. Подскажите, как исправить алгоритм.
Alex9
# -*- coding: utf-8 -*-
import sys
 
 
 
class Hanoi:
    def move(self, a, b, c, n):
        if n == 1:
            c.append(a[len(a)-1])
            del a[len(a)-1]
            if f == 1:    self.display(a, b, c)
        else:
            self.move(a, c, b, n - 1)
            c.append(a[len(a)-1])
            del a[len(a)-1]
            if f == 1:    self.display(a, b, c)
            self.move(b, a, c, n - 1)
    def __init__(self, n):
        if n > 0:
            self.a = []
            for i in range(n):
                self.a.append(n - i)
            self.b = []
            self.c = []
            self.n = n
            self.display(self.a, self.b, self.c)
            self.move(self.a, self.b, self.c, self.n)    
    def display(self, a, b, c):
        print u"1: ",
        for i in range(len(a)):
            print str(a[i]) + ' ',
        print ""
        print u"2: ",
        for i in range(len(b)):
            print str(b[i]) + ' ',
        print ""
        print u"3: ",
        for i in range(len(c)):
            print str(c[i]) + ' ',
        print ""
 
if len(sys.argv) > 3 or len(sys.argv) < 2:
    print "error"
    sys.exit(1)
f = 0 
n = int(sys.argv[1])
if len(sys.argv) == 3 and sys.argv[2] == "-v":
    f = 1
 
x = Hanoi(n)
 
del x
 
sys.exit(u"Complete")
Ответ верный, но выводится не каждый шаг решения. Как исправить ?
FishHook
c.append(a[len(a)-1])
Это что?
FishHook
def hanoi(n, source, helper, target):
    print source, helper, target
    if n > 0:
        print  "move tower of size %s to helper" % (n-1)
        hanoi(n - 1, source, target, helper)
        print "move disk from source peg to target peg"
        if source:
            target.append(source.pop())
            print "move tower of size %s from helper to target" % (n-1)
        hanoi(n - 1, helper, source, target)
source = [4,3,2,1]
target = []
helper = []
hanoi(len(source),source,helper,target)
Alex9
Мне нужно по заданию, чтобы шаги выводились в виде:
1(стержень): 3 2
2: 1
3:
FishHook
Чего Вам не хватает для того, чтобы переделать мой код под Ваши требования?
Alex9
В моем коде уже реализован этот алгоритм. Мне нужно расставить вызов display так, чтобы выводился каждый шаг (перемещение 1 кольца) 1 раз при параметре -v.
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB