➢在一个3×3的九宫中有1-8这8个数字以及一个空格随机摆放在其中的格子里。将该九宫格调整到目标状态。
➢规则:每次只能将与空格(上、下、左、右)相邻的一个数字移动到空格中。试编程实现这一问题的求解。
➢备注:为了程序中表示方便,用0代替空格。
➢初始状态和目标状态:均由用户通过键盘手工输入或者从文件读入(不可以写死在程序里面)。
➢实验结果需要包含以下初始状态和目标状态的结果(checkyouranswer:至少需要移动15步)。
其中代价函数选的是错位的数字,估价函数是步数加错位的数字,输出放在文件中,文件名请自行更改。
def solution(str1,strend,h1):
list1=[str1]#存放所有的节点
routelist=[('',0,h1,h1)]#存放操作步骤,元组表示(父节点,深度(n),错位数字(h),深度加错位总和)
#closelist=[]#存放已经选过的节点
openlist=[]#存放有可能被选中的节点
str2=str1
str4=""
list2=[]
#j=0#列表位置
while(True):
p=list1.index(str2)
n=routelist[p][1]+1
m=str2.index("0")#0所在位置
if m//3!=0:#上移条件是否成立
#上移
str3=list(str2)
str3[m],str3[m-3]=str3[m-3],str3[m]
str3=''.join(str3)
#
if str3 not in list1:
h = 0
if int(str3[8]) != 0:
h += 1
for i in range(0, 8):#判断错位的数字个数
if int(str3[i]) != i+1:
h += 1
else:
continue
list1.append(str3)#加入到已出现的状态中
routelist.append((p,n,h,n+h))
openlist.append(