[너비우선 탐색법으로 작성한 것임]
def list2str(m):
s=''
for x in m:
for y in x:
s=s+y
return s
def str2list(s):
m=[]
rl=[]
for x in s:
rl.append(x)
if len(rl)==5:
m.append(rl)
rl=[]
return m
def next_move(s, pos, t, d):
nl=[]
iter=[[-2,-1],[-1,-2],[-2,1],[-1,2],[2,1],[1,2],[2,-1],[1,-2]]
tt=chr(ord(t)+1)
m=str2list(s)
for dx,dy in iter:
x,y=pos[0]+dx,pos[1]+dy
if 0<=x<5 and 0<=y<5 and m[x][y]=='-':
mm=str2list(s)
mm[x][y]=tt
ss=list2str(mm)
if ss in d: pass
else:
nl.append([ss,[x,y],tt])
d[ss]=[pos,tt]
return nl
dicA={}
q=[]
dicA['A------------------------']=[[0,0],'A']
q.append(['A------------------------',[0,0],'A'])
while q:
s,pos,t=q.pop(0)
if t>'x': print(s,pos,t)
#input('#')
nl=next_move(s,pos,t,dicA)
for x in nl:
q.append(x)
=======================================================================
[깊이우선 탐색]
def list2str(m):
s=''
for x in m:
for y in x:
s=s+y
return s
def str2list(s):
m=[]
rl=[]
for x in s:
rl.append(x)
if len(rl)==5:
m.append(rl)
rl=[]
return m
def next_move(s, pos, t, d):
nl=[]
iter=[[-2,-1],[-1,-2],[-2,1],[-1,2],[2,1],[1,2],[2,-1],[1,-2]]
tt=chr(ord(t)+1)
m=str2list(s)
for dx,dy in iter:
x,y=pos[0]+dx,pos[1]+dy
if 0<=x<5 and 0<=y<5 and m[x][y]=='-':
mm=str2list(s)
mm[x][y]=tt
ss=list2str(mm)
if ss in d: pass
else:
nl.append([ss,[x,y],tt])
d[ss]=[pos,tt]
return nl
i=0
dicA={}
q=[]
dicA['A------------------------']=[[0,0],'A']
q.append(['A------------------------',[0,0],'A'])
while q:
s,pos,t=q.pop()
#i+=1
#if i%100000==0:
# input(t)
if t>'X':
print(s,pos,t)
break
#input('#')
nl=next_move(s,pos,t,dicA)
nl.reverse()
for x in nl:
q.append(x)
=======================================================================
5x5 채스판에서 0.0 에서 knight 가 출발하여 전체 판을 다 여행하는 길을 찾는 프로그램이다.
'자바·파이썬·자바스크립트 > 파이썬 프로그래밍' 카테고리의 다른 글
kivy 시작하기 (파이썬으로 앱만들기) (0) | 2015.11.15 |
---|---|
samurai sudoku Solver 버전1 (0) | 2015.10.16 |
get_next (next_permutation) (0) | 2014.07.22 |
점프 투 파이썬 사이트 소개 (0) | 2013.10.17 |
확장된 애너그램 사전만들기 (0) | 2013.07.24 |