그림 미로 생성


20

도전

"이미지"를 받아들이고 해당 이미지로부터 형성된 그림 미로를 출력하는 프로그램 / 기능을 작성하십시오 .

입력

프로그램은 두 가지 주장을 받아 들여야합니다.

  • 나는 미로를 형성하는 이미지
  • S, 미로에 솔루션을 표시할지 여부를 지정하는 부울

나는 다음과 같은 형태로 제공됩니다.

.......
.#####.
.#####.
#######
.#####.
.#####.
.......

여기서는 #경로에 포함 .되는 셀 이고 제외 할 셀입니다. 당신은 스왑 수 .의를, #의와는만큼 그들은 서로 다르기 때문에 선택의 문자로 바꿈. 또는 입력 이미지의 실제 비트 맵을 사용할 수 있습니다.

산출

결과 미로의 형태는 다음과 같습니다.

###############
#             #
# ### ####### #
# #.........# #
# #.#######.# #
# #.#.......# #
###.#.#########
....#.#........
#####.#.#######
#  ...#.....  #
# #.#######.# #
# #.........# #
# ####### ### #
#   #       # #
###############

여기서 #'는 벽을 나타내고, .'는 솔루션의 일부인 경로 부분을 나타내며 공간은 솔루션에서 제외 된 경로입니다. 그만큼.의 S가 거짓 인 경우 공백으로 대체 될 수있다. 다시 말하지만, 당신이 선택한 다른 문자들과 문자를 교체하거나 솔루션이 강조된 미로의 실제 비트 맵을 출력 할 수 있습니다.

추가 세부 사항

  • 경로는 하나의 셀 너비 여야합니다 (빈 공간의 거대한 풀이 경로가 될 수 없음)
  • 미로는 루프를 포함해서는 안됩니다
  • 미로는 완전히 연결되어 있어야합니다 (입구 / 출구에서 모든 셀에 접근 할 수 있어야 함)
  • 미로는 벽으로 둘러싸여 있어야합니다 (입구 / 출구가 아닌 한)
  • 솔루션 경로에는 막 다른 골목이 없어야합니다
  • 미로에는 정확히 1 개의 입구와 1 개의 출구가 있어야합니다
  • 입구와 출구는 그리드의 가장자리에 정렬되어야하며 솔루션 경로에 포함 된 셀에 인접해야합니다.
  • 입구와 출구의 위치를 ​​선택할 수 있습니다
  • 주어진 입력 이미지로부터 유효한 경로가 형성 될 수 있다고 가정 할 수 있습니다

(설명을 위해 추가됨) 아래 다이어그램은 솔루션 경로가 입력 이미지와 상관되는 방식을 보여줍니다.

Input (I): |    Output:            |    Corresponding Cells: 
           |                       |    (@'s denote #'s from I)
           |                       |
.......    |    ###############    |    ###############
.#####.    |    #             #    |    #             #
.#####.    |    # ### ####### #    |    # ### ####### #
#######    |    # #.........# #    |    # #@.@.@.@.@# #
.#####.    |    # #.#######.# #    |    # #.#######.# #
.#####.    |    # #.#.......# #    |    # #@#@.@.@.@# #
.......    |    ###.#.#########    |    ###.#.#########
           |    ....#.#........    |    .@.@#@#@.@.@.@.
           |    #####.#.#######    |    #####.#.#######
           |    #  ...#.....  #    |    #  @.@#@.@.@  #
           |    # #.#######.# #    |    # #.#######.# #
           |    # #.........# #    |    # #@.@.@.@.@# #
           |    # ####### ### #    |    # ####### ### #
           |    #   #       # #    |    #   #       # #
           |    ###############    |    ###############
           |                       |

테스트 사례

Wikipedia 에서 물을 수있는 예 :

입력:

..................
..................
.......####.......
......##..##......
.....##....##....#
.....#......#...##
.#############.##.
##..############..
#...###########...
#...##########....
#...##########....
#...##########....
#...##########....
....##########....
....##########....
....##########....
..................
..................

출력 (S = false) :

#####################################
#   #     #   #   #     #           #
# ### ### ### # # ##### ### ### ### #
#     # #   # # #         # #   # # #
# ### # ##### # ########### # ### # #
# # #         #           # # #   # #
# # # ### ##### # ### ### # ### ### #
#   # # #   #   # # #   # #   # #   #
# ### # ##### ##### ### ##### # # ###
# #   #       #   #   #       # # #  
### ####### ### ### # ### ##### ### #
#   #     # #   #   #   # #   # #   #
# ### ##### # ### ####### # # # # # #
# #       #             #   # #   # #
# # ##### ############# ### ### ### #
#   #   #       #     #   # #   # # #
# ### # ####### # ### ### # # ### # #
# # # #         #   # #   #   #     #
# # # ### ######### # # ##### # #####
# #   # # #       # #   #   # # #   #
# ##### # # ##### # ##### # # ### # #
#       # #   #   # #     # #   # # #
# ### ### ### # ### # ##### ####### #
#   # # #     # #   # #       #     #
# # # # ####### # ### # ##### # ### #
  # # # #   #   #     #     # #   # #
### # # # # # ############# # ### # #
#   # # # #   #         #   # #   # #
##### # # ##### ####### # ### ##### #
#     # # #   #       # #   #       #
##### # # # # ####### # ### #########
#     #     #         #       #     #
# ### ######### ############# # #####
# # #   #     # #       #     #     #
# # ######### # ####### ####### ### #
#             #                 #   #
#####################################

출력 (S = true) :

#####################################
#   #     #   #   #     #           #
# ### ### ### # # ##### ### ### ### #
#     # #   # # #         # #   # # #
# ### # ##### # ########### # ### # #
# # #         #.......    # # #   # #
# # # ### #####.# ###.### # ### ### #
#   # # #   #...# # #...# #   # #   #
# ### # #####.##### ###.##### # # ###
# #   #    ...#   #   #...    # # #..
### #######.### ### # ###.##### ###.#
#   #     #.#   #   #   #.#   # #...#
# ### #####.# ### #######.# # # #.# #
# #.......#.............#...# #...# #
# #.#####.#############.###.###.### #
#...#   #.......#.....#...#.#...# # #
#.### # #######.#.###.###.#.#.### # #
#.# # #  .......#...#.#...#...#     #
#.# # ###.#########.#.#.##### # #####
#.#   # #.#.......#.#...#...# # #   #
#.##### #.#.#####.#.#####.#.# ### # #
#.      #.#...#...#.#.....#.#   # # #
#.### ###.###.#.###.#.#####.####### #
#.  # # #.....#.#...#.#.....  #     #
#.# # # #######.#.###.#.##### # ### #
..# # # #...#...#.....#.....# #   # #
### # # #.#.#.#############.# ### # #
#   # # #.#...#.........#...# #   # #
##### # #.#####.#######.#.### ##### #
#     # #.#...#.......#.#...#       #
##### # #.#.#.#######.#.###.#########
#     #  ...#.........#.....  #     #
# ### ######### ############# # #####
# # #   #     # #       #     #     #
# # ######### # ####### ####### ### #
#             #                 #   #
#####################################

비트 맵 예 (위와 같은 미로) :

입력 : 입력 비트 맵출력 (S = false) : 강조되지 않은 출력 비트 맵 솔루션출력 (S = true) :출력 비트 맵 솔루션 강조


4
나일지도 모르지만 출력 미로에 입력 그림이 표시되지 않습니다.
Mike Bufardeci

@ mike-bufardeci 출력 미로에서 입력 사진을 보여주는 다이어그램을 추가했습니다. 희망이 도움이됩니다!
Dendrobium

2
미로를 연결해야하는 규칙은없는 것 같습니다. 이것이 유효한 해결책입니까? 또한 그리드가 벽으로 둘러싸여 있어야한다는 규칙이없는 것 같습니다 (벽 이외의 모든 출입구로 간주되지 않는 한).이것이 유효한 해결책입니까?
Martin Ender

1
또한 테스트 사례를 더 추가하십시오.
flawr

@ MartinBüttner 미로는 벽으로 완전히 연결되고 둘러싸여 있어야하며,이 점을 명확히하는 질문을 편집했습니다.
덴드로 비움

답변:


10

파이썬 3, 1599 바이트

나는 이것이 재미있는 프로젝트이며 매우 흥미롭고 다소 길다는 것을 알았습니다. 내가 이것을 보았을 때, 나는 미로 생성 알고리즘을 독점적으로 작성하고 개선하는 데 소비 한 여름을 즉시 상기시켜주었습니다.

잠시 후, 약 6000 바이트 길이의 초기 초안을 작성했으며 다음 몇 시간 동안 다음 프로그램으로 압축했습니다.

import math,random;R=range;L=len;T=sorted;P=print;N=random.randint
def M(I,S):
 I=I.rsplit('\n');s=[0]*(1+L(I[0])*2);G=[s]
 for i in R(L(I)):
  r=[0]
  for x in I[i]:r+=x,0
  G+=[r];s=[0]*(1+L(I[0])*2);G+=[s]
 c=E(G,L(G[0])-2,-2);G[c][L(G[0])-1]=1;e=[c,L(G[0])-2];c=E(G,1,2);G[c][0]=1;G[c][1]=1;s=[c,1]
 while s!=e:
  o=[];Q(G,s,e,-2,0,o,0);Q(G,s,e,0,2,o,1);Q(G,s,e,2,0,o,2);Q(G,s,e,0,-2,o,3);o=T(o,key=lambda x:(x[2],-x[1]))[0][0]
  if o==0:G[s[0]-1][s[1]]=1;s[0]-=2
  elif o==1:G[s[0]][s[1]+1]=1;s[1]+=2
  elif o==2:G[s[0]+1][s[1]]=1;s[0]+=2
  else:G[s[0]][s[1]-1]=1;s[1]-=2
  G[s[0]][s[1]]=1
 s=0
 while not s:
  r=N(1,(L(G)-1)/2)*2-1;c=N(1,(L(G[0])-1)/2)*2-1
  if G[r][c]in[1,2]:
   o=[];F(G,r-2,c,o,0);F(G,r,c+2,o,1);F(G,r+2,c,o,2);F(G,r,c-2,o,3)
   try:
    if o[0]==0:G[r-1][c]=2;G[r-2][c]=2
    elif o[0]==1:G[r][c+1]=2;G[r][c+2]=2
    elif o[0]==2:G[r+1][c]=2;G[r+2][c]=2
    else:G[r][c-1]=2;G[r][c-2]=2
   except:0
  s=1
  for x in G:
   if'.'in x:s=0;break
 *s,='#  '
 if S:s[1]='.'
 for x in G:
  for y in x:P(s[y],end='')
  P()
def Q(G,s,e,x,y,o,a,n=0):
 c=lambda x,y:G[s[0]+x][s[1]+y]is'#'
 try:
  if c(x,y):
   try:n+=c(2*x,2*y)
   except:0
   try:n+=c(x+abs(x)-2,y+abs(y)-2)
   except:0
   try:n+=c(x-abs(x)+2,y-abs(y)+2)
   except:0
   o+=[[a,math.sqrt((s[0]+x-e[0])**2+(s[1]+y-e[1])**2),n]]
 except:0
def F(G,r,c,o,a):
 try:
  if G[r][c] is'.':o+=[a]
 except:0
def E(G,y,z,d='#'):
 c=[]
 for x in R(1,L(G)-1,2):
  n=0
  try:n+=G[x-2][y]==d
  except:0
  try:n+=G[x+2][y]==d
  except:0
  n+=G[x][y+z]==d
  if G[x][y]==d:c+=[[x,n]]
 if L(c)>1:c=T(c,key=lambda x:x[1])
 return c[0][0]

ascii-art 미로처럼 보는 것은 무의미한 것입니다 ...

임의의 함수는 정확한 경로가 발견 될 때까지 사용되지 않기 때문에 동일한 입력이 몇 번 제공 되더라도 시작부터 끝까지의 경로는 동일하며이 프로그램은 위의 예에서 작동하면 때로는 '벽으로 들어가면'솔루션을 찾지 못할 수도 있습니다.

위의 예제를 실행하면 다음이 제공됩니다.

>>> M('''.......
.#####.
.#####.
#######
.#####.
.#####.
.......''',True)
###############
# # #   # #   #
# # # ### # # #
# #...#.....# #
# #.#.#.###.###
#  .#.#.#...# #
###.#.#.#.### #
....#.#.#.#....
# ###.#.#.#.###
# #...#.#.#.  #
# #.###.#.#.# #
# #.....#...# #
### ####### # #
#         # # #
###############
>>> 

이:

>>> M('''..................
..................
.......####.......
......##..##......
.....##....##....#
.....#......#...##
.#############.##.
##..############..
#...###########...
#...##########....
#...##########....
#...##########....
#...##########....
....##########....
....##########....
....##########....
..................
..................''',False)
#####################################
# #     #   # # #   # #   # # # # # #
# ### ##### # # # ### # ### # # # # #
#   # # #   #   # # # #   # # #   # #
### # # ### # ### # # # ### # ### # #
# #     #   # #         # # # # # # #
# ### ##### # # ##### ### # # # # # #
# # #   #   #     # #   # # # # # # #
# # # ##### # ##### ### # # # # # # #
# # # #         # # #         #      
# # # # # # ##### # ### # ######### #
# #   # # # #   # # # # # # # # #   #
# # ####### # ### # # ### # # # # # #
#         # #           #   #     # #
### ##### # # ######### ### ### ### #
#     #   # # #   #   #     #   # # #
# ### ### # # # # # # ####### ### # #
#   # #   # # # # # # #   #       # #
# ##### # # # # # # # # # # # ##### #
#   #   # # # # # # # # #   #     # #
# ####### # # # # # # # #############
#   #     # # # # # # #         #   #
# ####### # # # # # # ##### ##### # #
#   #     # # # # # #           # # #
# ### ### # # # # # ######### ### ###
    # #   # # # # #         #   #   #
# ### # # # # # # ######### ##### ###
#   # # # # # # #                 # #
# # # ### # # # ################### #
# # # # # # # #               #     #
# ### # # # # ############# ### ### #
# # # #     #                     # #
# # ##### # # # ##### # # ##### ### #
# # #     # # #     # # #     #   # #
### ##### # ### # # # ##### # ### # #
#         #   # # # #     # #   # # #
#####################################
>>> 

이:

>>> M('''..................
..................
.......####.......
......##..##......
.....##....##....#
.....#......#...##
.#############.##.
##..############..
#...###########...
#...##########....
#...##########....
#...##########....
#...##########....
....##########....
....##########....
....##########....
..................
..................''',True)
#####################################
#     #     # #   # # # # # # #     #
##### # # ### ### # # # # # # ### # #
# # # # # # # #     # # # # # # # # #
# # # ### # # ##### # # # # # # # ###
#   # #   # # #.......# #     #   # #
### # ### # # #.#####.# # ####### # #
#   # #   # #...#   #...#   # #   # #
### # ### # #.# # ### #.# ### ### # #
# # # # # #...# #   # #...  # #   #..
# # # # # #.# ### #######.### ### #.#
# #     #  .# #   # # #  .    # #...#
# # #######.##### # # ###.##### #.# #
#  .......#.#...........#...# #...# #
###.# ###.#.#.#########.###.# #.### #
#...# #  .#.#.#...#...#.....#...  # #
#.#######.#.#.#.#.#.#.#######.#######
#.    #  .#.#.#.#.#.#.#...#...#     #
#.#######.#.#.#.#.#.#.#.#.#.### #####
#.    #  .#.#.#.#.#.#.#.#...        #
#.#######.#.#.#.#.#.#.#.#############
#.    # #.#.#.#.#.#.#.#.....        #
#.##### #.#.#.#.#.#.#.#####.#########
#.  #    .#.#.#.#.#.#.......  # #   #
#.# # ###.#.#.#.#.#.########### # ###
..# # #  .#.#.#.#.#.........#   # # #
# # #####.#.#.#.#.#########.# ### # #
# # #    .#.#.#.#...........        #
#########.#.#.#.############### #####
#   #    .#.#.#.............# #     #
### # ###.#.#.#############.# ##### #
#     #  ...#...............      # #
##### # # ### # # # # ### # # ##### #
#     # #   # # # # #   # # #   #   #
####### # ### # # # ##### # ####### #
#       # #   # # #     # #       # #
#####################################
>>> 

이 프로그램을 직접 실행하려면 누구나 명령을 사용하십시오 M(Image, Show solution). 삼중 따옴표를 사용하여 이미지를 입력하는 것이 좋습니다. 그렇지 않으면 많은 백 슬래시 또는 줄 바꿈 문자가 포함되기 때문입니다.


1
정확한 닉네임 : p
Fatalize

1
잘 하셨어요! 몇 가지 팁 : , -> , -> 0대신 사용 하면 변수에 할당 할 가치가 있습니다 .->passl.append(a);l.append(b)l+=a,bl.append(a)l+=[a]'#'def E(G,y,z):\n c=[]def E(G,y,z,c=[]):
Loovjo

1
또한 if G[r][c]==1 or G[r][c]==2:-> if 0<G[r][c]<3:, s=[0]\n for x in R(L(I[0])*2):s+=[0]-> s=[0]*(1+L(I[0])*2)및 (테스트하지는 않았다고 생각합니다) G=[s]-> *G=s.
Loovjo 2016 년

조언을 주셔서 감사합니다 @Loovjo의 except:0, l+=a,b그리고 s=[0]*(1+L(I[0])*2)정말 도움이되었다. 불행히도, 어떤 이유로 든 함수 호출에서 c를 할당해도 작동이 중지되었음을 의미하는 여러 호출로 재설정되지 않습니다 .G [r] [c]는 문자열이 될 수 있으므로 <또는>를 사용할 수 없습니다. * G = s로 구문 오류가 발생했습니다. 여전히 훌륭한 조언입니다.
Anonymous No Lifer 2016 년

1
@AnonymousNoLifer 문제 없습니다. 또한 G[r][c]문자열이 될 수 있다면 G[r][c]in[1,2]작동해야합니다.
Loovjo 2016 년
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.