python 광도 검색으로 8수 코드 난제 해결

8디지털 난제


1. 제목 설명


8수 문제는 구궁 문제라고도 부른다.있다×3의 바둑판은 8개의 바둑알이 놓여 있는데, 각 바둑알에는 1부터 8까지의 어떤 숫자가 표시되어 있으며, 서로 다른 바둑알에 표시된 숫자는 같지 않다.바둑판에는 또 하나의 빈칸이 있는데, 빈칸과 인접한 바둑알은 빈칸으로 옮길 수 있다.해결해야 할 문제는 초기 상태와 목표 상태를 제시하고 초기 상태에서 목표 상태로 전환하는 이동 바둑알의 걸음 수가 가장 적은 이동 절차를 찾아내는 것이다.

코드


사용 알고리즘: 광범위한 검색 알고리즘
python

import numpy as np

class State:
 def __init__(self, state, directionFlag=None, parent=None):
 self.state = state
 self.direction = ['up', 'down', 'right', 'left']
 if directionFlag:
  self.direction.remove(directionFlag)
 self.parent = parent
 self.symbol = ' '

 def getDirection(self):
 return self.direction

 def showInfo(self):
 for i in range(3):
  for j in range(3):
  print(self.state[i, j], end=' ')
  print("
") print('->
') return def getEmptyPos(self): postion = np.where(self.state == self.symbol) return postion def generateSubStates(self): if not self.direction: return [] subStates = [] boarder = len(self.state) - 1 row, col = self.getEmptyPos() if 'left' in self.direction and col > 0: s = self.state.copy() temp = s.copy() s[row, col] = s[row, col-1] s[row, col-1] = temp[row, col] news = State(s, directionFlag='right', parent=self) subStates.append(news) if 'up' in self.direction and row > 0: s = self.state.copy() temp = s.copy() s[row, col] = s[row-1, col] s[row-1, col] = temp[row, col] news = State(s, directionFlag='down', parent=self) subStates.append(news) if 'down' in self.direction and row < boarder: s = self.state.copy() temp = s.copy() s[row, col] = s[row+1, col] s[row+1, col] = temp[row, col] news = State(s, directionFlag='up', parent=self) subStates.append(news) if self.direction.count('right') and col < boarder: s = self.state.copy() temp = s.copy() s[row, col] = s[row, col+1] s[row, col+1] = temp[row, col] news = State(s, directionFlag='left', parent=self) subStates.append(news) return subStates def solve(self): openTable = [] closeTable = [] openTable.append(self) steps = 1 while len(openTable) > 0: n = openTable.pop(0) closeTable.append(n) subStates = n.generateSubStates() path = [] for s in subStates: if (s.state == s.answer).all(): while s.parent and s.parent != originState: path.append(s.parent) s = s.parent path.reverse() return path, steps+1 openTable.extend(subStates) steps += 1 else: return None, None if __name__ == '__main__': symbolOfEmpty = ' ' State.symbol = symbolOfEmpty originState = State(np.array([[2, 8, 3], [1, 6 , 4], [7, symbolOfEmpty, 5]])) State.answer = np.array([[1, 2, 3], [8, State.symbol, 4], [7, 6, 5]]) s1 = State(state=originState.state) path, steps = s1.solve() if path: for node in path: node.showInfo() print(State.answer) print("Total steps is %d" % steps)
이상은python 광도 검색이 8수 코드의 난제를 해결하는 상세한 내용입니다. 더 많은python 광도 검색 8수 코드에 대한 자료는 저희 다른 관련 글을 주목해 주십시오!

좋은 웹페이지 즐겨찾기