八数码难题 Matlab
八数码问题代码及算法分析
八数码 Java代码
//8数码类
class Eight{
int e[][] = {{2,8,3},{1,6,4},{7,0,5}}; //默认的起始状态int faX ,faY; //保存父状态中0的位置
int f; //估价函数值
Eight former ;
public Eight(){
faX = -1;
faY=-1;
f=-1;
former = null;
}
public Eight(Eight other){
for(int i = 0; i<3; i++)
for(int j=0 ;j<3; j++){
e[i][j] = other.e[i][j];
}
faX = other.faX;
faY = other.faY;
f = other.f;
former = other.former;
}
public void print()
{
for(int i1 = 0;i1<3;i1++)
for(int j1=0;j1<3;j1++){
System.out.print(e[i1][j1]);
if(j1==2)
System.out.println();
}
System.out.println();
}
public void listAll( Eight e ){
while( e.former != null ){
e.former.print();
e = new Eight(e.former);
}
return ;
}
}
//算法实现类
public class Asearch{
static int dest[][] = {{1,2,3},{8,0,4},{7,6,5}}; static void Swap(Eight ee,int i,int j,int m,int n){ int temp;
8皇后问题matlab算法
M文件
function PlaceQueen(row,matrix,N)%回溯法放置皇后
if row>N
PrintQueen(N,matrix);%打印棋盘
else
for col=1:N
matrix(row,col)=1;
if row==1||Conflict(row,col,N,matrix)%检测是否冲突
PlaceQueen(row+1,matrix,N);
end
matrix(row,col)=0;
end
end
%子函数:检测冲突
function result=Conflict(row,col,N,matrix)%检测是否冲突
result=1;
for i=1:row-1
for j=1:N
if matrix(i,j)==1
if ((j==col)||(abs(row-i)==abs(col-j)))%是否产生冲突:在同一直线,斜线上
result=0;
break;
end
end
end
if result==0
break;
end
end
%子函数:打印棋盘信息
function PrintQueen(N,matrix)
global solutionNum; %定义全局变量,来累积方法数 solutionNum=solutionNum+1;
disp(['第',num2str(solutionNum),'种方法:'])
disp(matrix)
脚本文件
clear all
clc
global solutionNum;
solutionNum=0;%全局变量记录方法数
N=8;%皇后个数
matrix=zeros(N);%存储皇后位置信息
八数码难题
{ char cls[4]="cls",input='1'; int flag=1,sum=1;
while(input>='1'&&input<='4') {
open.clear(); closed.clear(); sum=1; flag=1; select(); cin>>input;
if(input>='1'&&input<='4') {
}
Baidu Nhomakorabea
} 四、
} }
实验分析
实验界面为:
本实验采取表的排序,并利用广度优先搜索来查找路径,基本实现了实验要求,仍 有不完善之处,仍需继续改正。
return pos>=0&&pos<3*3; } int isdiff(int ch[])//判断输入数码是否合法 {
for(int i=0;i<3*3-1;i++) for(int j=i+1;j<3*3;j++) if(ch[i]==ch[j]||!isok(i)||!isok(j)) return 0;
return pos+1;
return -1;
matlab实验七八的程序
实验第一题
a=[1];
b=[1 2 2 1];
sys=tf(a,b);
poles=roots(b)
figure(1);pzmap(sys);
t=0:0.02:10;
h=impulse(a,b,t);
figure(2);plot(t,h)
title('Impulse Respone')
[H,w]=freqs(a,b);
figure(3);plot(w,abs(H))
xlabel('\omega')
title('Magnitude Respone')
第二题
a=[1];
b=[1 5 6];
sys=tf(a,b);
t=0:0.02:10;
impulse(sys,t)
hold on
step(sys,t)
b=[1 1];
a=[1 5 6];
sys=tf(b,a);
t=0:0.02:10;
f=(t>=0&t<=1)*1;
lsim(sys,f,t)
impulse(sys,t)
conv(y1,y2)
% 实验八 MATLAB在数字信号处理中的应用练习一
x=[2 3 1 1 2 -1 0 3];nx=[-2:5]; h=[2 4 1 -2 0 -1];nh=[-3:2];
y1 = conv(x,h);
[y,ny]=conv_m(x,nx,h,nh);
stem(ny,y1,'*');title('卷积结果'); clear all;
练习二
a = [1 0];
b = [1 -1 -1];
sys = tf(a,b);
figure,zplane(a,b);title('零极点分布图');xlabel('实部');ylabel('虚部');
八数码难题--Matlab
b1=zhao(a1); %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% function [a1,b1]=zuo(a)
[x,y]=find(a==0);
a1=a;
a1(x,y)=a(x,y-1);
a1(x,y-1)=0;
b1=zhao(a1); %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% function [a1,b1]=you(a)
[x,y]=find(a==0);
a1=a;
a1(x,y)=a(x,y+1);
a1(x,y+1)=0;
b1=zhao(a1); %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% function z=panduan(a)
global E;
global I;
I=2;
[x,y]=size(E);
z=1;
for i=1:y
b=E{i};
v=(b-a).^2;
if sum(sum(v))==0
z=0;
break;
end
end %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% function y=zhao(a)
wan=[1 2 3;8 0 4;7 6 5];
y=0;
b=a-wan;
for i=1:3
for j=1:3
if b(i,j)~=0
y=y+1;
end
end
end %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% global E
global I
a=[2 8 3;1 0 4;7 6 5];
b=[1 2 3;8 0 4;7 6 5];
I=1;
E(1)={a};
八数码难题
八数码难题
一、问题简介
八方块移动游戏要求从一个含8个数字(用1-8表示)的方块以及一个空格方块(用0表示)的3x3矩阵的起始状态开始,不断移动该空格方块以使其和相邻的方块互换,直至达到所定义的目标状态。空格方块在中间位置时有上、下、左、右4个方向可移动,在四个角落上有2个方向可移动,在其他位置上有3个方向可移动。例如,假设一个3x3矩阵的初始状态为:
8 0 3
2 1 4
7 6 5
目标状态为:
1 2 3
8 0 4
7 6 5
二、算法分析
1、问题表示:
问题表示的核心是如何存储搜索过程中得到的状态。本人是这样存储的:对每个状态用一个9位数存储,例如:
把初始状态:
8 0 3
2 1 4
7 6 5
存储为一个9位数:803214765
2、问题分析
想法一:采用插入排序的方法,八数码问题好比是一列数,将各个行列的数字按大小排列,在插入的时候考虑方向性和比较性,对每个数字节点设置前后左右四个属性,分别在初始状态比较各自队列的大小,比如按照左前右后顺时针的方向依次比较和移动,设置哨兵,循环比较,最后得到的序列也就是八数码问题迎刃而解了。
想法二:采用prolog语言表示,
Prolog(Programming in Logic的缩写)是一种逻辑编程语言。它建立在逻辑学的理论基础之上,最初被运用于自然语言等研究领域。现在它已广泛的应用在人工智能的研究中,它可以用来建造专家系统、自然语言理解、智能知识库等。
2、解题算法:
广度搜索常用的优化方法:
哈希表法——记录队列中已有节点,用于判断是否需要扩展节点。
A*算法——构造估价函数。
八数码难题
已解决
八数码难题
悬赏分:200 - 解决时间:2005-10-10 19:41
问题描述:
有一个3*3的棋盘,其中有0-8 9个数字,0表示空格,其他的数字可以和0交换位置。求由初始状态
1 2 3
4 5 6
7 8 0
到达目标状态步数最少的解。
问题补充:最好用c
提问者:华雯- 见习魔法师三级
最佳答案
输入方法:
例如:
input(从键盘):
1 2 3 7 4 5 8 0 6
output(向屏幕):
Step:1
1 2 3
4 5 6
7 8 0
Step:2
1 2 3
4 5 0
7 8 6
Step:3
1 2 3
4 0 5
7 8 6
Step:4
1 2 3
0 4 5
7 8 6
Step:5
1 2 3
7 4 5
0 8 6
Step:6
7 4 5
8 0 6
我的程序:
#include
#include
#include
struct bsm
{
int s[9];
int prep,pos;
} ar1[1000],ar2[1000];
int h1,r1,h2,r2,step;
struct bsm p;
int pd(int k)
{
int i,j,b1,b2;
b1=1;
p.s[p.pos+k]=p.s[p.pos]+p.s[p.pos+k]; p.s[p.pos]=p.s[p.pos+k]-p.s[p.pos]; p.s[p.pos+k]=p.s[p.pos+k]-p.s[p.pos]; p.pos=p.pos+k;
for (i=0;i<=r1;i++)
{
b2=0;
for (j=0;j<9;j++)
if (!(ar1[i].s[j]==p.s[j])) b2=1;
智能控制(研究生)习题集
习题集
第一章概论
1.试从学科和能力两个方面说明什么是人工智能。
2.哪些思想、思潮、时间和人物在人工智能发展过程中起了重要作用?
3.近年来人工智能研究取得哪些重要进展?
4.为什么能够用计算机模拟人类智能?
5.目前人工智能学界有哪些学派?它们的认知观为何?
6.自动控制存在什么机遇与挑战?为什么要提出智能控制?
7.简述智能控制的发展过程,并说明人工智能对自动控制的影响。
8.傅京孙对智能控制有哪些贡献?
9.什么是智能控制?它具有哪些特点?
10.智能控制器的一般结构和各部分的作用为何?它与传统控制器有何异同?
11.智能控制学科有哪几种结构理论?这些理论的内容是什么?
12.为什么要把信息论引入智能控制学科结构?
13.人工智能不同学派的思想在智能控制上有何反映?
第二章知识表示方法
1.状态空间法、问题归约法、谓词逻辑法和语义网络法的要点是什么?它们有何本质上的联系及异同点?
2.设有3个传教士和3个野人来到河边,打算乘一只船从右岸渡到左岸去。该船的负载能力为两人。在任何时候,如果野人人数超过传教士人数,那么野人就会把传教士吃掉。他们怎样才能用这条船安全地把所有人都渡过河去?
3.利用下图,用状态空间法规划一个最短的旅行路程:此旅程从城市A开始,访问其他城市不多于一次,并返回A。选择一个状态表示,表示出所求得的状态空间的节点及弧线,标出适当的代价,并指明图中从起始节点到目标节点的最佳路径。
4.试说明怎样把一棵与或解树用来表达下图所示的电网络阻抗的计算。单独的R、L或C可分别用R、jωL或1/jωC来计算,这个事实用作本原问题。后继算符应以复合并联和串联阻抗的规则为基础。
人工智能A星算法解决八数码难题程序代码
#include "Stdio.h"
#include "Conio.h"
#include "stdlib.h"
#include "math.h"
void Copy_node(struct node *p1,struct node *p2);
void Calculate_f(int deepth,struct node *p);
void Add_to_open(struct node *p);
void Add_to_closed(struct node *p);
void Remove_p(struct node *name,struct node *p);
int Test_A_B(struct node *p1,struct node *p2);
struct node * Search_A(struct node *name,struct node *temp);
void Print_result(struct node *p);
struct node // 定义8数码的节点状态
{
int s[3][3]; //当前8数码的状态
int i_0; //当前空格所在行号
int j_0; //当前空格所在列号
int f; //当前代价值
int d; //当前节点深度
int h; //启发信息,采用数码"不在位"距离和
struct node *father; //指向解路径上该节点的父节点
struct node *next; //指向所在open或closed表中的下一个元素
} ;
struct node s_0={{2,8,3,1,6,4,7,0,5},2,1,0,0,0,NULL,NULL}; //定义初始状态
人工智能实验八数码问题的求解策略
人工智能上机实验二八数码问题的求解策略1、广度优先算法程序截图:
2、最佳优先算法程序截图:
(接上图)
3、程序代码:
①广度优先算法:
(defun init-search (start goal)
(declare (special *open*))
(declare (special *closed*))
(declare (special *moves*))
(declare (special *start*))
(declare (special *goal*))
(let (tuple)
(setq tuple (cons start '(nil)) )
(setq *open* (list tuple) )
(setq *closed* nil )
(setq *start* start)
(setq *goal* goal)
(setq *moves* '(blank-left blank-up blank-right blank-down))
(breadth-first-search)))
(defun breadth-first-search ()
(declare (special *open*))
(declare (special *closed*))
(declare (special *goal*))
(declare (special *moves*))
(let (state tuple children path)
(cond ((null *open*) 'FAIL!)
(t
(setq tuple (car *open*) )
8皇后问题matlab算法
M文件
function PlaceQueen(row,matrix,N)%回溯法放置皇后
if row>N
PrintQueen(N,matrix);%打印棋盘
else
for col=1:N
matrix(row,col)=1;
if row==1||Conflict(row,col,N,matrix)%检测是否冲突
PlaceQueen(row+1,matrix,N);
end
matrix(row,col)=0;
end
end
%子函数:检测冲突
function result=Conflict(row,col,N,matrix)%检测是否冲突
result=1;
for i=1:row-1
for j=1:N
if matrix(i,j)==1
if ((j==col)||(abs(row-i)==abs(col-j)))%是否产生冲突:在同一直线,斜线上
result=0;
break;
end
end
end
if result==0
break;
end
end
%子函数:打印棋盘信息
function PrintQueen(N,matrix)
global solutionNum; %定义全局变量,来累积方法数 solutionNum=solutionNum+1;
disp(['第',num2str(solutionNum),'种方法:'])
disp(matrix)
脚本文件
clear all
clc
global solutionNum;
solutionNum=0;%全局变量记录方法数
N=8;%皇后个数
matrix=zeros(N);%存储皇后位置信息
人工智能实验一-八数码问题
【实验名称】人工智能实验一:八数码问题
算法描述:
步1 把初始节点S0放入OPEN表中,计算h(S0);
步2 若OPEN表为空,则搜索失败,退出;
步3 取OPEN表中前面第一个节点N放入CLOSED表中;
步4 若目标节点Sg =N,则搜索成功,结束;
步5 若N不可扩展,则转步2。
步6 扩展N,计算每个子节点x的函数值h(x),并将所有子节点配上指向N的返回指针放入OPEN表中,再对OPEN表中的所有子节点按其
函数值大小以升序排序,转步2。
实验代码:
#include
#include
#include
#define Overflow 1
#define N 3
int goal[N][N]={1,2,3,8,0,4,7,6,5};
int zero[2],NodeQTY=0;
int *z=zero;//记录0的位置,zero[0]:r行;zero[1]:c列
typedef int Piece;
struct Chessboard{//棋盘信息
Piece pos[N][N];//记录每个数码a的位置r行c列
int d,f,move;//d:深度;f:启发函数值;move:父节点移动到该节点的方式
};
struct LNode{
Chessboard board;
LNode *parent,*next;
bool flag;
};
typedef LNode* List;
int* Findzero(LNode* &Node)
{
int i,j,zr[2];
int *z=zr;
for(i=0;i
for(j=0;j
if(Node->board.pos[i][j]==0){
八叉树算法 matlab代码
八叉树算法
简介
在计算机图形学和计算机视觉领域,八叉树算法是一种常用的数据结构,用于对三维空间进行分割和索引。八叉树是一种树形结构,每个节点可以有最多8个子节点,因此得名为八叉树。它的主要思想是将三维空间递归地划分为八个子立方体,从而实现对三维数据的快速检索和查询。
八叉树的构造
八叉树的构造过程是通过递归实现的。下面是八叉树的构造算法:
1.初始化根节点,将整个空间作为根节点的区域。
2.对于每个节点,判断其区域中是否存在点或物体。
3.如果节点的区域中只有一个点或物体,则将该节点标记为叶子节点,并保存
相应的点或物体信息。
4.如果节点的区域中有多个点或物体,则将该节点划分为八个子节点,每个子
节点负责其父节点区域的1/8子区域。
5.对于每个子节点,重复步骤2-4,直到满足终止条件。
6.构造完整的八叉树后,可以根据需要进行查询和检索。
八叉树的应用
八叉树算法在计算机图形学和计算机视觉领域有广泛的应用,以下是几个常见的应用场景:
三维场景管理
八叉树可以用于对三维场景进行管理和索引。它可以将复杂的三维场景分割为多个子立方体,每个子立方体都有自己的节点,从而实现对场景中物体的高效检索和渲染。
点云数据处理
八叉树也常用于处理点云数据。点云是由大量点组成的三维数据集,通过八叉树可以对点云进行高效的存储和处理。八叉树可以将点云数据划分为多个子区域,从而减少不必要的计算和存储开销。
基于体素的渲染
八叉树在体素渲染中也有应用。体素渲染是一种基于体素(三维像素)的渲染方法,八叉树可以对体素数据进行分割和索引,加速体素渲染的计算速度。
八数码问题
八数码问题
八数码问题是一个经典的问题,也称为滑动谜题。问题的描述是:在一个3x3的棋盘上,有1-8这8个数字和一个空格组成的九个格子,目标是通过移动数字,将棋盘上的数字按从小到大的顺序排列,空格在最后一个位置。
解决这个问题的算法主要有搜索算法,其中最常见的是A*算法。A*算法是一种启发式搜索算法,通过建立一个状态空间图,并使用启发式函数估算每个状态到目标状态的距离,来优化搜索过程。在八数码问题中,启发式函数可以使用曼哈顿距离来估算。
另外,也可以使用深度优先搜索、广度优先搜索、IDA*等搜索算法来解决八数码问题。这些算法在搜索过程中以不同的方式遍历状态空间图,找到最优解。
解决八数码问题的具体步骤一般如下:
1. 定义初始状态和目标状态。
2. 使用搜索算法进行搜索,找到从初始状态到目标状态的最优解。
3. 在搜索过程中,需要注意状态的合法性和重复状态的处理。
4. 输出最优解,即一系列移动操作,将初始状态转化为目标状态。
需要注意的是,八数码问题可能存在无解的情况,需要在搜索过程中判断并处理无解情况。此外,由于八数码问题的状态空间较大,搜索过程可能需要一定的时间和空间复杂度。因此,在实现解决算法时,需要考虑性能优化的问题。
人工智能实验报告八数码难题
昆明理工大学信息工程与自动化学院学生实验报告
(201
— 201 学年第一学期) 课程名称:
开课实验室:
年 月曰
、实验内容
八数码难题,问题描述:在3X 3方格棋盘上,分别放置了标有数字123,4,5,6,7,8的
八张牌,初始状态SO ,目标状态S1如图所示,可以使用的操作有:空格上移,空格左移, 空格右移,空格下移。只允许位于空格左,上,右,下方的牌移入空格。用广度优先搜索 策略寻找从初始状态到目标状态的解路径。
SO
S1
二、实验原理
算法思想:
这是一种盲目搜索算法。算法主要思想是从初始结点开始依次沿其上下左右四个方向扩展 结点,
并逐一检查这些后继结点是否为目标结点,若不等于目标结点则把该后继结点插入到
6
□ 0 3
□
□
IJ
数组末尾。然后取数组中未扩展的第一个结点重复以上操作,直到得到目标结点为止或在限定步数以内未得到解。
广度优先搜索策略数据结构:
void Bfs()
{
queue<Map> Queue;
Queue.push(org);
HashTable[ org.myindex ] = -1;
while( NOT Queue.empty() )
{
Map node = Queue.front();
Queue.pop( );
for(int k =0 ; k < 4; k ++ )
{
Map tmp = node;
tmp.position = node.position + derection[k];
if(tmp.position < 0 || tmp.position > 8 || ( k > 1 && tmp.position / 3 != node.position /3 ) ) continue;
人工智能大作业八数码问题
基于A星算法的八数码问题求解
学号:姓名:
摘要:在人工智能领域中, 八数码问题一直都是一个游戏难题。介绍了八数码问题, 然后在启发式搜索算法上对A * 算法定义进行了解释, 并在其旨在提高搜索效率的方面作了比较详尽的介绍, 详细描述了基于图搜索算法的解决此类问题的一种启发式搜索算法:A* 算法。再依据这种算法用可视化编程语言VC+ + 6. 0 来实现八数码问题的求解过程, 取得了预期的搜索解, 提高了搜索效率。
关键词:八数码问题; 启发式搜索; A* 算法
本组成员:
本人分工:主要负责进行问题分析,提出解决方案,进行系统设计,算法上具体负责主函数的编写。
1 引言
八数码问题是人工智能的一个经典的问题。文中通过设计一个基于A* 算法的状态空间搜索程序, 对于给定的初始状态, 采用h ( n ) = p ( n ) 表示以每一个将牌与目标位置之间距离的总和作为启发函数的度量, 并用可视化编程语言VC+ + 来实现该问题。
2 算法原理与系统设计
1)A*算法思想
A*算法是对A算法的估价函数f(n)=g(n)+h(n)加上某些限制后得到的一种启发式搜索算法。A*算法对A算法中的g(n)和h(n)分别提出如下限制:第一,g(n)是对最小代价g*(n)的估计,且g(n)>0;第二,h(n)是最小代价h*(n)的下界,即对任意节点n 均有h(n)≤h*(n)。即满足上述两条限制的A算法称为A*算法。
2)估价函数
用来估算节点希望程度的量度,叫估价函数f(x),f(x)=g(x)+h(x)。g(x)为从初始节点到当前节点已经付出的代价,h(x)为从当前节点到目标节点的最优路径的估计代价。本算法中令g(x)为当前节点的深度depth,h(x)为当前节点每个数字位与目标节点数字位间距离和dist,进一步考虑当前结点与目标结点的距离信息,令启发函数h ( n )为当前8个数字位与目标结点对应数字位距离和(不考虑中
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
一、实验目的
1、熟悉和掌握启发式搜索的定义、估价函数和算法过程。
2、利用A*算法求解N数码难题,理解求解流程和搜索顺序。
二、实验内容
以八数码为例实现A或A*算法。
1、分析算法中的OPEN表CLOSE表的生成过程。
1)建立一个队列,计算初始结点的估价函数f,并将初始结点入队,设置队列头和尾指针。
2)取出队列头(队列头指针所指)的结点,如果该结点是目标结点,则输出路径,程序结束。否则对结点进行扩展。
3)检查扩展出的新结点是否与队列中的结点重复,若与不能再扩展的结点重复(位于队列头指针之前),则将它抛弃;若新结点与待扩展的结点重复(位于队列头指针之后),则比较两个结点的估价函数中g的大小,保留较小g值的结点。跳至第五步。
4)如果扩展出的新结点与队列中的结点不重复,则按照它的估价函数f大小将它插入队列中的头结点后待扩展结点的适当位置,使它们按从小到大的顺序排列,最后更新队列尾指针。
5)如果队列头的结点还可以扩展,直接返回第二步。否则将队列头指针指向下一结点,再返回第二步。
2、分析估价函数对搜索算法的影响。
3、分析启发式搜索算法的特点。
广度优先搜索和双向广度优先搜索都属于盲目搜索,这在状态空间不大的情况下是很合适的算法,可是当状态空间十分庞大时,它们的效率实在太低,往往都是在搜索了大量无关的状态结点后才碰到解答,甚至更本不能碰到解答。
搜索是一种试探性的查寻过程,为了减少搜索的盲目性引,增加试探的准确性,就要采用启发式搜索了。所谓启发式搜索就是在搜索中要对每一个搜索的位置进行评估,从中选择最好、可能容易到达目标的位置,再从这个位置向前进行搜索,这样就可以在搜索中省略大量无关的结点,提高了效率。
启发式函数选取为:f*(n)=g*(n)+ h*(n)
其中:
g*(n)是搜索树中节点n的深度
h*(n)用来计算对应于节点n的数据中错放的棋子个数。
三、实验结果
四、程序
function [a1,b1]=shang(a)
[x,y]=find(a==0);
a1=a;
a1(x,y)=a(x-1,y);
a1(x-1,y)=0;
b1=zhao(a1); %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% function [a1,b1]=xia(a)
[x,y]=find(a==0);
a1=a;
a1(x,y)=a(x+1,y);
a1(x+1,y)=0;
b1=zhao(a1); %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% function [a1,b1]=zuo(a)
[x,y]=find(a==0);
a1=a;
a1(x,y)=a(x,y-1);
a1(x,y-1)=0;
b1=zhao(a1); %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% function [a1,b1]=you(a)
[x,y]=find(a==0);
a1=a;
a1(x,y)=a(x,y+1);
a1(x,y+1)=0;
b1=zhao(a1); %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% function z=panduan(a)
global E;
global I;
I=2;
[x,y]=size(E);
z=1;
for i=1:y
b=E{i};
v=(b-a).^2;
if sum(sum(v))==0
z=0;
break;
end
end %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% function y=zhao(a)
wan=[1 2 3;8 0 4;7 6 5];
y=0;
b=a-wan;
for i=1:3
for j=1:3
if b(i,j)~=0
y=y+1;
end
end
end %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% global E
global I
a=[2 8 3;1 0 4;7 6 5];
b=[1 2 3;8 0 4;7 6 5];
I=1;
E(1)={a};
for i=2:20
q=b-E{i};
if sum(sum(q.^2))
E(i)={kaka(E{i-1})};
celldisp(E(i))
else
break;
end
end %%%%%%%%%%%%%%%%%%%%%%%%%%%%%% function [a1]=kaka(a)
global I;
global E;
c=[2 8 3;1 0 4;7 6 5];
E(1)={c};
[x,y]=find(a==0);
z=9;
if x==1
if y==1
[x1,y1]=xia(a);
if y1 if panduan(x1) b=x1; z=y1; end end [x2,y2]=you(a); if y2 if panduan(x2) b=x2; z=y2; end end a1=b; end if y==2 [x1,y1]=xia(a); if y1 if panduan(x1) b=x1; z=y1; end end [x2,y2]=zuo(a); if y2