木头335 2022-10-25 00:11 采纳率: 0%
浏览 75
已结题

判断元素(矩阵类型)是否列表中,报错

import copy
import numpy as np

initState = input('输入初始8数码:')

initState='120345678'
tragetState = '012345678'

求逆序数

def nixishu(StrState):
toListState = list(StrState)
k = len(toListState)
number = 0
for i in range(1, k):
count = 0
for j in range(0, i):
if toListState[j] > toListState[i] : #列表调用使用中括号
count = count + 1
number = number + count
return number

#判断信号是否有解
def HaveSolution(initState1,tragetState1):
if nixishu(initState1)%2 == nixishu(tragetState1)%2:
return True
else:
return False

#打印信号是否有解
if HaveSolution(initState,tragetState):
print('有解')
else:
print('无解')
#将字符串转换为3*3的矩阵
def ToArray(strdata):
# strdata='012345678'
listdata=list(strdata)
arraydata = np.matrix(listdata)
arraydata_3=arraydata.reshape(3,3)
return arraydata_3

#找到0的位置
def getlocal(data):
i,j=np.where(data=='0')
return i[0],j[0]

#移动数字
def right(data):
i,j=getlocal(data)
arr=copy.deepcopy(data)
#只要0不在在矩阵的最右边,即不是data[i][2]即可以右移
if j in (0,len(data)-2):
data[i,j],data[i,j+1]=data[i,j+1], data[i,j] #交换元素
return arr

def left(data):
i,j=getlocal(data)
arr=copy.deepcopy(data)
#只要0不在在矩阵的最左边,即不是data[i][0]即可以左移
if j in (1,len(data)-1):
data[i,j],data[i,j-1]=data[i,j-1], data[i,j] #交换元素
return arr

def up(data):
i,j=getlocal(data)
arr=copy.deepcopy(data)
#只要0不在在矩阵的最上边,即不是data[0][j]即可以左移
if i in (1,len(data)-1):
data[i,j],data[i-1,j]=data[i-1,j], data[i,j] #同上一行交换元素
return arr
def down(data):
i,j=getlocal(data)
arr=copy.deepcopy(data)
#只要0不在在矩阵的最下边,即data[2][j]即可以左移(即0行和1行)
if i in (0,len(data)-2):
data[i,j],data[i+1,j]=data[i+1,j],data[i,j] #交换元素
return arr

class eightNumeber:

def init(self,data,parentflag):

self.data=data

self.parentflag=parentflag

# 实例类,将输入的3维元组/矩阵赋值给Node0

node0 = eightNumeber(ToArray(initState),'none')

openList=[ToArray(initState)]
closeList=[]

fuzhualist=[]

#宽度优先算法

while len(openList)>0:
fuzhualist=openList.pop(0)
# print(openList)
closeList.append(fuzhualist)
if np.all(fuzhualist==ToArray(tragetState)):
print('搜索完毕',fuzhualist)
# result=[]
# result.append(fuzhualist)
break
else:
getlocal(fuzhualist)
updata=up(fuzhualist)
# # # if np.all(updata !=ToArray(tragetState)):
if updata not in openList and updata not in closeList and updata is not None:
openList.append(updata)
print("上移 : ", updata)
downdata = down(fuzhualist)
if downdata not in openList and downdata not in closeList and downdata is not None:
openList.append(downdata)
print("下移 : ", downdata)
leftdata = left(fuzhualist)
if leftdata not in openList and leftdata not in closeList and leftdata is not None:
openList.append(leftdata)
print("下移 : ", leftdata)
rightdata = right(fuzhualist)
if rightdata not in openList and rightdata not in closeList and rightdata is not None:
openList.append(rightdata)
print("下移 : ", rightdata)

以上是源代码,其中leftdata not in closeList报错,但是fuzhualist not in closeList正确,且第一次循环中leftdata和fuzhualist完全相同
(判断矩阵元素是否列表中,报错)

  • 写回答

7条回答 默认 最新

  • Jackyin0720 2022-10-25 11:18
    关注

    强迫症的我,自觉的帮题友摆好了一部分,还有一部分实在无能为力,为了不违背题友的真正意思,就将它全部注释了。大家可以参考一二

    
    import copy
    import numpy as np
    
    initState = input('输入初始8数码:')
    initState='120345678'
    tragetState = '012345678'
    
    ##求逆序数
    def nixishu(StrState):
        toListState = list(StrState)
        k = len(toListState)
        number = 0
        for i in range(1, k):
            count = 0
        for j in range(0, i):
            if toListState[j] > toListState[i] : #列表调用使用中括号
                 count = count + 1
                 number = number + count
                 return number
    
    #判断信号是否有解
    def HaveSolution(initState1,tragetState1):
        if nixishu(initState1)%2 == nixishu(tragetState1)%2:
            return True
        else:
            return False
    
    #打印信号是否有解
        if HaveSolution(initState,tragetState):
             print('有解')
        else:
             print('无解')
    
    #将字符串转换为3*3的矩阵
    def ToArray(strdata):
        # strdata='012345678'
        listdata=list(strdata)
        arraydata = np.matrix(listdata)
        arraydata_3=arraydata.reshape(3,3)
        return arraydata_3
    
    #找到0的位置
    def getlocal(data):
        i,j=np.where(data=='0')
        return i[0],j[0]
    
    #移动数字
    def right(data):
        i,j=getlocal(data)
        arr=copy.deepcopy(data)
    #只要0不在在矩阵的最右边,即不是data[i][2]即可以右移
        if j in (0,len(data)-2):
            data[i,j],data[i,j+1]=data[i,j+1], data[i,j] #交换元素
        return arr
    
    def left(data):
        i,j=getlocal(data)
        arr=copy.deepcopy(data)
    #只要0不在在矩阵的最左边,即不是data[i][0]即可以左移
        if j in (1,len(data)-1):
            data[i,j],data[i,j-1]=data[i,j-1], data[i,j] #交换元素
        return arr
    
    def up(data):
        i,j=getlocal(data)
        arr=copy.deepcopy(data)
    #只要0不在在矩阵的最上边,即不是data[0][j]即可以左移
        if i in (1,len(data)-1):
            data[i,j],data[i-1,j]=data[i-1,j], data[i,j] #同上一行交换元素
        return arr
    def down(data):
        i,j=getlocal(data)
        arr=copy.deepcopy(data)
    #只要0不在在矩阵的最下边,即data[2][j]即可以左移(即0行和1行)
        if i in (0,len(data)-2):
            data[i,j],data[i+1,j]=data[i+1,j],data[i,j] #交换元素
        return arr
    
    class eightNumeber:
        def init(self,data,parentflag):
            self.data=data
            self.parentflag=parentflag
    # 实例类,将输入的3维元组/矩阵赋值给Node0
            node0 = eightNumeber(ToArray(initState),'none')
            openList=[ToArray(initState)]
            closeList=[]
    
            fuzhualist=[]
    #宽度优先算法
            while len(openList)>0:
                fuzhualist=openList.pop(0)
    #print(openList)
            closeList.append(fuzhualist)
            if np.all(fuzhualist==ToArray(tragetState)):
                 print('搜索完毕',fuzhualist)
    '''
    #result=[]
    #result.append(fuzhualist)
                break
           else:
                getlocal(fuzhualist)
                updata=up(fuzhualist)
    # # # if np.all(updata !=ToArray(tragetState)):
            if updata not in openList and updata not in closeList and updata is not None:
                    openList.append(updata)
                    print("上移 : ", updata)
                    downdata = down(fuzhualist)
            if downdata not in openList and downdata not in closeList and downdata is not None:
                    openList.append(downdata)
                    print("下移 : ", downdata)
                    leftdata = left(fuzhualist)
            if leftdata not in openList and leftdata not in closeList and leftdata is not None:
                    openList.append(leftdata)
                    print("下移 : ", leftdata)
                    rightdata = right(fuzhualist)
            if rightdata not in openList and rightdata not in closeList and rightdata is not None:
                    openList.append(rightdata)
                    print("下移 : ", rightdata)
    '''
    
    
    评论

报告相同问题?

问题事件

  • 系统已结题 11月2日
  • 创建了问题 10月25日

悬赏问题

  • ¥15 系统 24h2 专业工作站版,浏览文件夹的图库,视频,图片之类的怎样删除?
  • ¥15 怎么把512还原为520格式
  • ¥15 MATLAB的动态模态分解出现错误,以CFX非定常模拟结果为快照
  • ¥15 求高通平台Softsim调试经验
  • ¥15 canal如何实现将mysql多张表(月表)采集入库到目标表中(一张表)?
  • ¥15 wpf ScrollViewer实现冻结左侧宽度w范围内的视图
  • ¥15 栅极驱动低侧烧毁MOSFET
  • ¥30 写segy数据时出错3
  • ¥100 linux下qt运行QCefView demo报错
  • ¥50 F1C100S下的红外解码IR_RX驱动问题