八数码难题 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算法

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实验七八的程序

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

八数码难题--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星算法解决八数码难题程序代码

人工智能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算法

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代码

八叉树算法 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. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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

相关文档
最新文档