Informatika2-2016/Gyakorlat11Megold

A MathWikiből
A lap korábbi változatát látod, amilyen Kkovacs (vitalap | szerkesztései) 2016. május 16., 13:02-kor történt szerkesztése után volt.
(eltér) ←Régebbi változat | Aktuális változat (eltér) | Újabb változat→ (eltér)

Tartalomjegyzék

Feladatok

Pascal-háromszög

Írjunk egy függvényt! Bemenete egy egész szám, n, kimenete pedig a Pascal-háromszög n-edik sora (lista).

def pascal(n):
    if n == 1:
        return [1]
    if n == 2:
        return [1,1]
    else:
        previous = [1,1]
        for i in range(2,n):
            actual = [1]
            for i in range(1,len(previous)):
                actual.append(previous[i]+previous[i-1])
            actual.append(1)    
            previous = actual
    return previous
print pascal(14)

Huszárok

Áll a sakktáblán egy huszár. Számoljuk ki a sakktábla minden mezőjére, hogy legkevesebb hány lépéssel tudunk eljutni oda az előbbi huszárral! A feladat megoldásához írjunk egy függvényt, knight(x,y), amelynek két bemenete a huszár táblán elfoglalt helyének koordinátái. A visszatérési érték legyen egy nyolcszor nyolcas lista! Hsználjunk dinamikus programozást!

board = [[-1]* 8 for i in range(8)]
 
def fill(x,y):
    ret = [[x+dx,y+dy] for dx in [2,-2] for dy in [1,-1]]
    ret += [[x+dx,y+dy] for dx in [1,-1] for dy in [2,-2]]
    ret = [r for r in ret if r[0] >= 0 and r[1] >= 0 and r[0] < 8 and r[1] < 8]
    return ret
 
print fill(1,4)
 
found = True
n = 0
board[0][0] = 0
 
while found:
    found = False
    for y in range(len(board)):
        for x in range(len(board[y])):
            if board[y][x] == -1:
                found = True
            if board[y][x] == n:
                for [yf,xf] in fill(y,x):
                    if board[yf][xf] == -1:
                        board[yf][xf] = n + 1
    n += 1                    
for i in range(7,-1,-1):
    print board[i]

Zárt terület kifestése

Olvassuk be az alábbi "szöveget" listák listájába (minden karakter egy elem): mentsük le egy fájlba kézzel, majd nyissuk meg a fájlt Pythonnal! Írjunk egy fill(x,y) függvényt, ami ugyanazt csinálja, mint a Paint kitöltő funkciója! Az (x,y) pontból kiindulva a . helyére # jelet tesz, amíg a # jel által jelölt falba nem ütközik! A módszer rekurzív: kifestjük az (x,y) pontot, majd a szomszédait, ha azok nem # jelek. Hívjuk meg a szomszédokra (akik nem # jelek) a függvényt rekurzívan. Ha nincs kit kiszínezni, akkor álljunk meg!

.....................................
...#######################...........
...#.....................#...........
...#.....................#...........
...#.....................#...........
...#.....................#...........
...#.....................#...........
...#.....................#######.....
...###.................##......#.....
...#..##.............##........#.....
...#....##.........##..........#.....
...#......##.....##............#.....
...#........#####..............#.....
...#........#..................#.....
...#.......##..................#.....
...#.....##....................#.....
...#...##......................#.....
...#############################.....
.....................................
.....................................
.....................................
.....................................
picture = []
with open('abra.txt') as f:
    for l in f:
        L = []
        for c in l:
            L.append(c)
        picture.append(L)
 
def color(x,y,picture):
    if y < len(picture):
        if x < len(picture[y]):
            if picture[y][x] == ".":
                picture[y][x] = "#"
                color(x+1,y,picture)
                color(x-1,y,picture)
                color(x,y+1,picture)
                color(x,y-1,picture)
color(2,2,picture)
for p in picture:
    print "".join(p),
Személyes eszközök