python广度搜索解决八数码难题

 更新时间:2021年04月07日 14:18:20   作者:胡乱huluan  
这篇文章主要介绍了python广度搜索解决八数码难题。想了解算法和数据结构的同学,一定要看一下

—— 八数码难题 ——

1.题目描述

八数码问题也称为九宫问题。在3×3的棋盘,摆有八个棋子,每个棋子上标有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("\n")
 print('->\n')
 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广度搜索解决八数码难题的详细内容,更多关于python广度搜索八数码的资料请关注脚本之家其它相关文章!

相关文章

  • 利用Python实现批量加密Excel文件

    利用Python实现批量加密Excel文件

    在日常工作中,我们经常需要处理大量的Excel文件,为了保护敏感数据的安全性,我们可能需要对这些文件进行加密,本文主要介绍了如何使用Python实现批量加密Excel文件,需要的可以参考下
    2023-11-11
  • 对pandas replace函数的使用方法小结

    对pandas replace函数的使用方法小结

    今天小编就为大家分享一篇对pandas replace函数的使用方法小结,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-05-05
  • 详解Python如何获取视频文件的大小和时长

    详解Python如何获取视频文件的大小和时长

    这篇文章主要为大家详细介绍了Python如何实现获取视频文件的大小和时长,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起了解一下
    2023-03-03
  • 详解【python】str与json类型转换

    详解【python】str与json类型转换

    这篇文章主要介绍了【python】str与json类型转换,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-04-04
  • Python使用scipy.fft进行大学经典的傅立叶变换

    Python使用scipy.fft进行大学经典的傅立叶变换

    傅里叶变换是在高数是一个很重要的知识点,本文将介绍Python使用scipy.fft进行大学经典的傅立叶变换,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-06-06
  • 使用Python进行AES加密和解密的示例代码

    使用Python进行AES加密和解密的示例代码

    这篇文章主要介绍了使用Python进行AES加密和解密的示例代码,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-02-02
  • django配置DJANGO_SETTINGS_MODULE的实现

    django配置DJANGO_SETTINGS_MODULE的实现

    本文主要介绍了django配置DJANGO_SETTINGS_MODULE,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-03-03
  • Pycharm使用Conda激活环境失败的问题解决

    Pycharm使用Conda激活环境失败的问题解决

    本文主要介绍了Pycharm使用Conda激活环境失败的问题解决,文中主要介绍了两种问题的解决,具有一定的参考价值,感兴趣的可以了解一下
    2023-09-09
  • Python机器学习之SVM支持向量机

    Python机器学习之SVM支持向量机

    这篇文章主要为大家详细介绍了Python机器学习之SVM支持向量机,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-12-12
  • Python堆栈的具体使用

    Python堆栈的具体使用

    本文主要介绍了Python堆栈的具体使用,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-11-11

最新评论