Уведомления

Группа в Telegram: @pythonsu

#1 Фев. 17, 2013 15:45:52

Alex9
Зарегистрирован: 2013-02-10
Сообщения: 9
Репутация: +  0  -
Профиль   Отправить e-mail  

Ханойские башни

# -*- 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.

Офлайн

#2 Фев. 17, 2013 18:09:41

lorien
От:
Зарегистрирован: 2006-08-20
Сообщения: 755
Репутация: +  37  -
Профиль  

Ханойские башни

Попробуйте исправить ошибки.

Офлайн

#3 Фев. 17, 2013 20:53:12

Alex9
Зарегистрирован: 2013-02-10
Сообщения: 9
Репутация: +  0  -
Профиль   Отправить e-mail  

Ханойские башни

Мне кажется, ошибка связана с использованием self.

Офлайн

#4 Фев. 17, 2013 21:28:00

Alex9
Зарегистрирован: 2013-02-10
Сообщения: 9
Репутация: +  0  -
Профиль   Отправить e-mail  

Ханойские башни

# -*- 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")
Теперь программа работает, но решение неверно. Подскажите, как исправить алгоритм.

Офлайн

#5 Фев. 18, 2013 08:42:41

Alex9
Зарегистрирован: 2013-02-10
Сообщения: 9
Репутация: +  0  -
Профиль   Отправить e-mail  

Ханойские башни

# -*- 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")
Ответ верный, но выводится не каждый шаг решения. Как исправить ?

Офлайн

#6 Фев. 18, 2013 09:20:35

FishHook
От:
Зарегистрирован: 2011-01-08
Сообщения: 8312
Репутация: +  568  -
Профиль   Отправить e-mail  

Ханойские башни

c.append(a[len(a)-1])
Это что?



Офлайн

#7 Фев. 18, 2013 09:35:27

FishHook
От:
Зарегистрирован: 2011-01-08
Сообщения: 8312
Репутация: +  568  -
Профиль   Отправить e-mail  

Ханойские башни

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)



Офлайн

#8 Фев. 19, 2013 09:08:25

Alex9
Зарегистрирован: 2013-02-10
Сообщения: 9
Репутация: +  0  -
Профиль   Отправить e-mail  

Ханойские башни

Мне нужно по заданию, чтобы шаги выводились в виде:
1(стержень): 3 2
2: 1
3:

Офлайн

#9 Фев. 19, 2013 11:52:10

FishHook
От:
Зарегистрирован: 2011-01-08
Сообщения: 8312
Репутация: +  568  -
Профиль   Отправить e-mail  

Ханойские башни

Чего Вам не хватает для того, чтобы переделать мой код под Ваши требования?



Офлайн

#10 Фев. 19, 2013 13:05:57

Alex9
Зарегистрирован: 2013-02-10
Сообщения: 9
Репутация: +  0  -
Профиль   Отправить e-mail  

Ханойские башни

В моем коде уже реализован этот алгоритм. Мне нужно расставить вызов display так, чтобы выводился каждый шаг (перемещение 1 кольца) 1 раз при параметре -v.

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version