文档库 最新最全的文档下载
当前位置:文档库 › 迷宫求解

迷宫求解

迷宫求解
迷宫求解

课程设计(论文)任务书

课程名称:数据结构

课程题目:迷宫求解

课程设计地点:创新大楼软件实训中心机房专业:软件工程班级:软件工程12班姓名:学号:15号指导教师:郑宇超成绩:

完成日期:2015 年 6 月25 日

一、本课程设计的目的:

⑴训练学生灵活应用所学的C/C++和数据结构知识,独立完成问题分析,结合课程的理论知识,编写程序求解指定问题;

⑵初步掌握软件开发过程的问题分析、系统设计、编码、测试等基本方法和技能;

⑶提高综合运用所学的理论知识和方法独立分析和解决问题的能力,巩固、深化学生的理论知识,提升编程水平。

二、课程设计任务及要求:

1)基本要求:

以一个m*n 的长方阵表示迷宫,设置两个门,一个入口,另一个是出口。设计一个程序,对任意设定的迷宫,求出一条从入口到出口的通路,或得出没有通路的结论。要求:⑴首先实现一个栈类型,然后编写一个求解迷宫的非递归程序。⑵求得的通路以三元组(i,j,d)的形式输出,其中(i,j)指示迷宫中的一个坐标,d 表示走到下一坐标的方向

2)课程设计论文编写要求:

⑴理论设计部分以课程设计论文的形式提交,格式必须按照课程设计论文标准格式进行书写和装订;

⑵课程设计报告包括中文目录、设计任务、需求分析、概要设计、详细设计、编码实现、调试分析、课设总结、谢辞、参考文献、附录等;

⑶设计部分应包含系统功能模块图,调试分析应包括运行截图等。

3)课程设计评分标准:

⑴学习态度:10 分;

⑵系统设计:20 分;

⑶编程调试:20 分;

⑷回答问题:20 分;

⑸论文撰写:30 分。

4)参考文献:

⑴严蔚敏,吴伟民. 数据结构(C 语言版)[M]. 清华大学出版社. 2010.3

⑵严蔚敏,吴伟民. 数据结构题集(C 语言版)[M]. 清华大学出版社. 1999.2

⑶何钦铭,冯燕等. 数据结构课程设计[M]. 浙江大学出版社. 2007.8 5)

5)课程设计进度安排:

⑴准备阶段(4 学时):选择设计题目、了解设计目的要求、查阅相关资料;

⑵程序模块设计分析阶段(4 学时):程序概要设计、详细设计;

⑶代码编写调试阶段(8 学时):程序模块代码编写、调试、测试;

⑷撰写论文阶段(4 学时):总结课程设计任务和设计内容,撰写课程设计论文。

6)课程设计题目具体要求:通讯录管理系统的设计与实现任务:完成通讯

录的一般性管理工作:通讯录的录入、增加、修改、删除、查找和按照字字母顺序输出等功能。每个记录包含姓名、电话号码、住址等个人信息。

学生签名:2015年6月25 日

课程设计(论文)评审意见

1)学习态度(10 分):优()、良()、中()、一般()、差();2)系统设计(20 分):优()、良()、中()、一般()、差();3)编程调试(20 分):优()、良()、中()、一般()、差();4)回答问题(20 分):优()、良()、中()、一般()、差();5)论文撰写(30 分):优()、良()、中()、一般()、差();6)格式规范性及考勤是否降等级:是()、否()

7)评阅人:郑宇超职称:讲师2015 年6月25日

目录

一、问题描述 (1)

二、设计思路 (1)

三、系统设计 (2)

四、函数设计 (4)

五、代码实现 (4)

六、调试分析 (9)

七、心得 (9)

八、参考文献 (10)

1、问题描述:

输入一个任意大小的迷宫数据,用递归和非递归两种方法求出一条走出迷宫的路径,并将路径输出。

2、设计思路;

1、描述:从入口出发,按某一方向向前探索,若能走通并且未走过,即某处可以到达,则到达新点,否则试探下一个方向;若所有的方向均没有通路,则沿原路返回前一点,换下一个方向再继续试探,直到找到一条通路,或无路可走又返回入口点。

在求解过程中,为了保证在到达某一点后不能向前继续行走(无路)时,能正确返回前一点以便继续从下一个方向向前试探,则需要用一个栈(递归不需要)保存所能够到达的每一点的下标及从该点前进的方向。设迷宫为m行n列,利用maze[m][n]来表示一个迷宫,maze[i][j]=0或1;其中:0表示通路,1表示不通,当从某点向下试探时,中间点有四个方向可以试探,而四个角点有两个方向,其他边缘点有三个方向,为使问题简单化,用maze[m+2][n+2]来表示迷宫,而迷宫的四周的值全部为1,这样做使问题简单了,每个点的试探方向全部为4,不用再判断当前点的试探方向有几个。

2、流程图:

3、数据结构设计:

在上述表示迷宫的情况下,每个点有4个方向去试探,如当前点的坐标(x,y),与其相邻的4个点的坐标都可根据与该点的相

邻方位而得到。因为出口在(m,n),因此试探顺序规定为:从当前位置向前试探的方向为从右边沿顺时针方向进行。为了简化问题,方便求出新点的坐标,将从开始右边沿顺时针进行的4个方向的坐标增量放在一个结构数组maze[M][N]中,在数组中,每个元素有两个域组成,x为横坐标增量,y为纵坐标增量。这样对maze设计会很方便地求出从某点(x,y)按某一方向v(0<=v<=3)到达的新点(i,j)的坐标:

a=i+diradd[d][0];

b=j+diradd[d][1];

当到达了某点而无路可走时需返回前一点,再从前一点开始向下一个方向继续试探。因此,压入栈中的不仅是顺序到达的各点的坐标,而且还要有从前一点到达本点的方向。栈中元素是一个由行、列、方向组成。具体结构定义如下:

#define M 15

#define N 15

struct mark //定义坐标类型

{

int x;

int y;

};

struct Element //链栈元素

{ int x,y; //3

int d; //4};

typedef struct LStack //链栈,存储路线移动的方向坐标

{

Element elem;

struct LStack *next;

}*PLStack;

4、功能函数设计:

迷宫栈的实现函数mazepath()

迷宫递归的实现函数path()

为了防止重复达到某点,以避免发生死循环,每次达到了某点(i,j)后,改变maze[i][j]的值,迷宫栈的实现直接置-1,算法结束前恢复原迷宫;而迷宫递归是将当前值置为已走的步骤,这样输出时对走过的路更显而易见。

(1)栈的函数设计:

栈的初始化函数: Init_SeqStack()

判栈空: Empty_SeqStack()

入栈函数: Push_SeqStack()

出栈函数: Pop_SeqStack()

取栈顶函数: GetTop_SeqStack()

5、程序代码:

#include

#include

#define M 15

#define N 15

struct mark //定义坐标类型

{

int x;

int y;

};

struct Element //链栈元素

{

int x,y; //3

int d; //4

};

typedef struct LStack //链栈

{

Element elem;

struct LStack *next;

}*PLStack;

/*************栈函数****************/

int InitStack(PLStack &S)//构造空栈

{

S=NULL;

return 1;

}

int StackEmpty(PLStack S)//判断是否为空{

if(S==NULL)

return 1;

else

return 0;

}

int Push(PLStack &S, Element e)//压入{

PLStack p;

p=(PLStack)malloc(sizeof(LStack));

p->elem=e;

p->next=S;

S=p;

return 1;

}

int Pop(PLStack &S,Element &e) //输出

{

PLStack p;

if(!StackEmpty(S))

{

e=S->elem;

p=S;

S=S->next;

free(p);

return 1;

}

else

return 0;

}

/***************求迷宫路径函数***********************/

void MazePath(struct mark start,struct mark end,int maze[M][N],int diradd[4][2]) {

int i,j,d;int a,b;

Element elem,e;

PLStack S1, S2;

InitStack(S1);

InitStack(S2);

maze[start.x][start.y]=2; //9

elem.x=start.x;

elem.y=start.y;

elem.d=-1; //10

Push(S1,elem);

while(!StackEmpty(S1)) //11

{

Pop(S1,elem);

i=elem.x;

j=elem.y;

d=elem.d+1; //12

while(d<4) //试探上下左右各个方向

{

a=i+diradd[d][0];

b=j+diradd[d][1];

if(a==end.x && b==end.y && maze[a][b]==0) //13

{

elem.x=i;

elem.y=j;

elem.d=d;

Push(S1,elem);

elem.x=a;

elem.y=b;

elem.d=886; //方向输出为-1 判断是否到了出口

Push(S1,elem);

printf("\n0=右1=下2=左3=上886为则走出迷宫\n\n通路为:(行坐标,列坐标,方向)\n");

while(S1) //14

{

Pop(S1,e);

Push(S2,e);

}

while(S2)

{

Pop(S2,e);

printf("-->(%d,%d,%d)",e.x,e.y,e.d);

}

return;

}

if(maze[a][b]==0)

{

maze[a][b]=2;

elem.x=i;

elem.y=j;

elem.d=d;

Push(S1,elem);

i=a; //

j=b;

d=-1;

}

d++;

}

}

printf("没有找到可以走出此迷宫的路径\n");

}

/*************建立迷宫*******************/

void initmaze(int maze[M][N])

{

int i,j;

int m,n; //迷宫行,列[/M]

printf("请输入迷宫的行数m=");

scanf("%d",&m);

printf("请输入迷宫的列数n=");

scanf("%d",&n);

printf("\n请输入迷宫的各行各列:\n用空格隔开,0代表路,1代表墙\n",m,n);

for(i=1;i<=m;i++)

for(j=1;j<=n;j++)

scanf("%d",&maze[i][j]);

printf("你建立的迷宫为(最外圈为墙)...\n");

for(i=0;i<=m+1;i++) //加一圈围墙

{

maze[i][0]=1;

maze[i][n+1]=1;

}

for(j=0;j<=n+1;j++)

{

maze[0][j]=1;

maze[m+1][j]=1;

}

for(i=0;i<=m+1;i++) //输出迷宫

{

for(j=0;j<=n+1;j++)

printf("%d ",maze[i][j]);

printf("\n");

}

}

void main()

{

int sto[M][N],c;

struct mark start,end; //start,end入口和出口的坐标

int add[4][2]={{0,1},{1,0},{0,-1},{-1,0}};//行增量和列增量方向依次为上下左右[/M] printf("******************************************************************** ************\n");

printf(" 欢迎进入迷宫求解系统\n");

printf(" 设计者:罗华荣\n");

printf("******************************************************************** ************\n");

printf(" ☆生成迷宫请按:1\n");

printf(" ☆退出请按:2\n\n");

printf("******************************************************************** ************\n");

scanf("%d",&c);

switch(c)

{

case 1:initmaze(sto);

printf("输入入口的横坐标,纵坐标[逗号隔开]\n");

scanf("%d,%d",&start.x,&start.y);

printf("输入出口的横坐标,纵坐标[逗号隔开]\n");

scanf("%d,%d",&end.x,&end.y);

MazePath(start,end,sto,add); //find path

system("PAUSE");

case 2:exit (0);break;

}

}

6、调试分析:

7、设计心得:

迷宫这个问题也是老师经常讲的例子,是加深对栈运用的好程序。这个程序又加了个递归的算法,相同的程序不同的算法。我结合老师提过的思想与教材上的例子,很顺利的完成了这个程序。每次上机都会遇到题目,这次也不例外,经过我的不懈努力,解决了部分,还有的现在不能解决,只能留着日后思考和解决了,例如简化代码,可视化调试。这次的程序设计也让我意识到,在编写之前,做整体的规划很重要,这才能让我们的编写效率更高。

8、参考文献:

⑴严蔚敏,吴伟民. 数据结构(C 语言版)[M]. 清华大学出版社. 2010.3

⑵严蔚敏,吴伟民. 数据结构题集(C 语言版)[M]. 清华大学出版社. 1999.2

⑶何钦铭,冯燕等. 数据结构课程设计[M]. 浙江大学出版社. 2007.8 5)

算法分析与设计 查找迷宫的最短路径(深度算法)

算法分析与设计 查找迷宫的最短路径(深度算法) 计算机科学与技术12级 16班 2012/12/16

【摘要】:迷宫求解是一个古老的游戏,要在迷宫中找到出口,需要经过一连串的错误尝试才能找到正确的路径,有的时候甚至找不到路径。类似于给定一个m*n的矩形网格,设其左上角为起点S。一辆汽车从起点出发驶向右下角终点T。在若干网格处设置了障碍,表示该网格不可到达。设计一个算法,求汽车从起点S出发到达终点T的一条路线。用计算机求解这个问题时,我们通常采用的是回溯方法,即从入口出发,顺某方向向前探索,若能走通,则继续往前走;否则沿原路退回。换一个方向再继续探索,直至所有可能的通路都探索到为止。为了保证在任何位置上都能沿原路退回,显然需要用一个后进先出的结构来保存从入口到当前位置的路径。因此,在求迷宫通路的算法中应用“栈”也就是自然而然的事。当然还有其他的方法来解决,例如顺序表,深度优先遍历,广度优先遍历等。 【关键词】:最短路径; 时间复杂度;深度优先搜索 【Summary】Maze solving is an ancient game , you want to find the exit in the maze , need to go through a series of trial and error to find the right path , and sometimes not even find the path . A m * n rectangular grid , similar to a given set its upper-left corner as the starting point S . A car from the starting point towards the bottom right corner of the end of T . Set up barriers at certain grid , indicates that the grid is unreachable . Design an algorithm , find the car starting to reach the end point T, route from the starting point S . Use the computer to solve this problem , we usually use the backtracking method , that is, starting from the entrance , Shun forward to explore a direction , if we go through , and continue to move forward ; otherwise return along the same route . Continue to explore another direction , until all possible paths to explore to far . In order to ensure that in any position along the same route back , it is clear that the need to use a LIFO structure to save the path from the entrance to the current position . Therefore , in seeking labyrinth path algorithm application "stack" is the natural thing to do . Of course , there are other ways to solve , for example, the sequence table , depth-first traversal , breadth -first traversal . 【Key phrase】Shortest path ; time complexity ; deep-first search

迷宫最短路径数据结构源码实验报告

实验报告 课程名称数据结构 实验名称迷宫最短路径 实验类型综合型 实验地点计405机房 实验日期2017.5.13 指导教师魏海平 专业软件工程 班级软件1601 学号1611030102 姓名寇春雷 辽宁石油化工大学计算机与通信工程学院

数据结构实验报告评分表

实验二迷宫最短路径 题目:迷宫最短路径 ⒈问题描述 从一个迷宫的入口到出口找出一条最短路经。用一个二维数组MAZE(1..m,1..n)模拟迷宫,数组元素为0表示该位置可以通过,数组元素为1表示该位置不可以通行。MAZE(1,1)和MAZE(m,n)分别为迷宫的入口和出口。 ⒉基本要求 (1)输入数据 a.输入迷宫的大小m行和n列,两者为整数 b.由随机数产生0或1,建立迷宫。 (2)输出数据 首先输出模拟迷宫的二维数组,若存在最短路经,则由出口回朔到入口打印这一条路径,如下所示:(m,n),……,(i,j),……,(1,1) 如无通道,则打印: THERE IS NO PATH. ⒊实现提示 (1)数据结构 ①为了在程序中判断方便,把迷宫扩展成为MAZE(0..m+1,0..n+1),扩展部分的元素 设置为1,相当于在迷宫周围布上一圈不准通过的墙,这样,在迷宫的任一位置(I,j)上都有八个可以移动的方向。 ②用二维数组MOVE(1..8,1..2)存放八个方向上的位置量,如图所示: (i+MOVE[1,1],j+MOVE[1,2]) ,2]) ,2]) ,2])

③为了标志已经通过的位置,采用一个标志数组MARK(1..m,1..n)初值为0,在寻 找路径的过程中,若通过了位置(i,j),则将MARK(i,j)置为为1。 ④为了记录查找过程中到达位置及其前一位置,建立一个Q(1..m*n-1,0..2)数组, 对于某一个数组元素Q(P),其中,Q(P,0)和Q(P,1)记下到达位置i和j,Q(P,2)记下其出发点在Q数组中的下标。 (2)算法基本思想 将入口(1,1)作为第一个出发点,依次在八个反方向上搜索可通行的位置,形成第一层新的出发点,然后对第一层中各个位置分别搜索他所在八个方向上的可通行位置,形成第二层新的出发点,…,如此进行下去,直至达到出口(m,n)或者迷宫所有位置都搜索完毕为止。 具体实施:从(m,n)开始,将其记入Q数组,比如记入Q(1),以它作为第一个出发点,依次对八个方向进行搜索,若下一个位置(I,j)可通行并且尚未经过(即MAZE(i,j)=0 且MARK(i,j)=0),则记入Q数组,如记在Q(P),则在Q(P,2)中要记下其出发点在Q数组中的下标1,在八个方向上都搜索过以后,根据先进先出的原则Q从数组中重新取出一个位置作为新的出发点(这里,我们实际上把Q数组作为一个顺序表示的队列),重复以上过程,若能达到位置(m ,n),表示找到最短路径;若Q数组中已经没有位置可以作为新的出发点了,则表示迷宫没有通路。 4.需求分析 (1)以二维数组maze[M+2][N+2]表示迷宫,其中maze[i][0]和maze[i][N+1](0=

用c语言实现迷宫求解完美源代码

#include #include #include #define TRUE 1 #define FALSE 0 #define OK 1 #define ERROR 0 #define OVERFLOW -2 #define UNDERFLOW -2 typedef int Status; //-----栈开始----- typedef struct{//迷宫中r行c列的位置 int r; int c; }PostType;//坐标位置类型 typedef struct{ int ord;// 当前位置在路径上的序号 PostType seat;// 当前坐标 int di;// 从此通块走向下一通块的“方向” }SElemType;// 栈的元素类型 //定义链式栈的存储结构 struct LNode { SElemType data;//数据域 struct LNode *next;//指针域 }; struct LStack { struct LNode *top;//栈顶指针 }; Status InitStack(LStack &s)//操作结果:构造一个空栈S { struct LNode *p; p=(LNode *)malloc(sizeof(LNode)); if(!p) {printf("分配失败,退出程序"); exit(ERROR); } s.top=p; p->next=NULL; return OK; }

Status StackEmpty(LStack s) //若栈s为空栈,则返回TRUE,否则FALSE { if(s.top->next==NULL) return TRUE; return FALSE; } Status Push(LStack &s,SElemType e)//插入元素e成为新的栈顶元素 { struct LNode *p; p=(LNode *)malloc(sizeof(LNode)); if(!p) exit(OVERFLOW); s.top->data=e; p->next=s.top; s.top=p; return OK; } Status Pop(LStack &s,SElemType &e)//删除s的栈顶元素,并且用e返回其值{ struct LNode *p; if(!(s.top->next)) exit(UNDERFLOW); p=s.top; s.top=p->next; e=s.top->data; free(p); return OK; } Status DestroyStack(LStack &s)//操作结果:栈s被销毁 { struct LNode *p; p=s.top; while(p) { s.top=p->next; free(p); p=s.top; } return OK; } //-----栈结束------ //-----迷宫开始------- #define MAXLEN 10// 迷宫包括外墙最大行列数 typedef struct{ int r;

迷宫问题的求解

迷宫问题求解 一.问题描述: 请设计一个算法实现迷宫问题求解。 二.需求分析: 程序可实现用户与计算机的交互过程。在计算机显示提示信息后,可由用户输入迷宫的大小与形态,以“0”表示墙壁,以“1”表示通路。利用栈操作寻找一条从入口至出口的通路,最终输出带有路线的迷宫。 三.算法思想: 1.栈的设计: 用计算机解迷宫问题时,通常用的是“穷举求解”的方法,即从入口出发,顺某一方向向前探索,若能走通则继续向前走;否则沿原路退回,换一个方向再继续探索,直至所有可能的通路都探索到为止。为了保证在任何位置上都能沿原路退回,显然需要用一个后进先出的结构来保存从入口到当前位置的路径。因此,可以利用“栈”来求解迷宫问题。 2. 表示迷宫的数据结构: 设迷宫为m行n列,利用maze[m][n]来表示一个迷宫,maze[i][j]=0或1; 其中0表示墙壁(不通),1表示通路,当从某点向下试探时,中间点有4个方向可以试探,(见图)而四个角点有2个方向,其它边缘点有3个方向,为使问题简单化,用maze[m+2][n+2]来表示迷宫,而迷宫的四周的值全部为0。这样做可使问题简化,每个点的试探方向全部为4,不用再判断当前点的试探方向有几个,同时与迷宫周围是墙壁这一实际问题相一致。 0 1 2 3 4 5 6 7 8 9 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 1 0 0 0 0 2 0 1 1 0 1 0 0 0 0 0 3 0 1 1 1 1 1 1 1 0 0 4 0 1 1 0 0 1 0 0 0 0 5 0 0 1 1 1 0 1 1 1 0 6 0 1 0 0 1 1 1 1 1 0 7 0 0 0 0 0 0 0 0 0 0 3. 试探方向: 在上述表示迷宫的情况下,每个点有4个方向去试探,如当前点的坐标(x , y),与其相邻的4个点的坐标都可根据与该点的相邻方位而得到,如图所示。因为出口在(m,n),因此试探顺序规定为:从当前位置向前试探的方向为从正东沿顺时针方向进行。为了简化问题,

工艺流程图 高三复习题2017(含答案)

化工流程题的解题策略 1.一个完整的无机化工生产流程一般具有下列过程: 2.各过程涉及的考点: (1)对原料进行预处理的常用方法及其作用: ①研磨:减小固体的颗粒度,增大固体与液体或气体间的接触面积,加快反应速率。 ②水浸:与水接触反应或溶解。 ③酸浸:与酸接触反应或溶解,使可溶性金属离子进入溶液,不溶物通过过滤除去。 ④灼烧:除去可燃性杂质或使原料初步转化。如从海带中提取碘时的灼烧就是为了除去可燃性杂质,将有机 碘转化为碘盐。 ⑤煅烧:改变结构和组成,使一些物质能溶解;并使一些杂质在高温下氧化、分解,如煅烧高岭土和石灰石。(2)核心化学反应要掌握: ① 元素及其化合物知识:化工生产将原料转变成产品的过程,也是物质经历相互转化的过程。 理解物质之间的转化关系,就要用到元素及其化合物的相关知识。一般围绕铁、铜、铝、镁、氯、硫、磷、硅等元素的单质或化合物的工业制备来进行命题,需要掌握这些元素及其化合物的知识 ②还要掌握有关化工生产的知识,熟悉的有纯碱工业、氨工业、硅单质的制备、氯碱工业、海水中提取镁、海水中提取溴等; ③化学反应原理:化工生产中把原料转变成产品的过程就是化学反应的过程,从化学反应原理的角度选择原料、控制条件和选择设备等,是化工生产的基本思路。化学反应原理的相关知识包括质量守恒定律、化学反应速率、化学平衡、电化学、化学热力学等,做到能综合运用这些知识分析化工生产中化学反应的情况。 (3)化工生产过程中分离提纯、除杂等环节,与高中化学基本实验的原理紧密联系,包括过滤、洗涤、蒸发、结晶、蒸馏、萃取、分液等基本实验操作及原理,并要熟悉所用到的相关仪器。 (4)对整个工艺流程能进行评价: ①体现绿色化学思想(使用无毒无害原料,采用原子利用率高的制备路线,原料的循环利用,副产物综合利用,节能,等); ②高效节能方面(原料廉价,工艺简单,产品的纯度高,能耗低等) (5)化学计算:纯度,转化率、产率计算,有效数字的取舍 2.解答基本步骤 (1)读题头,得目的,划原料,明产品,解决“干什么” 一般采用“首尾分析法”:通过阅读题头,了解流程图以外的文字描述、表格信息、后续设问中的提示性信息,通过对比分析工业流程示意图中的第一种物质(原材料)与最后一种物质(产品),弄清从原料出发,要得到最终产品,必须除去什么元素、引进什么元素。 (2)读题问,逐空填答,用语要规范,解决“怎么写” 从化学原理的角度、用化学语言作答;要抓住主要问题,针对具体问题作具体分析。具体答题要点如下: ①答题所问:要看清题目要求,按要求答题。如:写离子方程式还是化学方程式;写物质的名称还是化学

求解迷宫问题-(c语言-很详细哦)教学教材

求解迷宫问题-(c语言-很详细哦)

求迷宫问题就是求出从入口到出口的路径。在求解时,通常用的是“穷举求解”的方法,即从入口出发,顺某一方向向前试探,若能走通,则继续往前走;否则沿原路退回,换一个方向再继续试探,直至所有可能的通路都试探完为止。为了保证在任何位置上都能沿原路退回(称为回溯),需要用一个后进先出的栈来保存从入口到当前位置的路径。 首先用如图3.3所示的方块图表示迷宫。对于图中的每个方块,用空白表示通道,用阴影表示墙。所求路径必须是简单路径,即在求得的路径上不能重复出现同一通道块。 为了表示迷宫,设置一个数组mg,其中每个元素表示一个方块的状态,为0时表示对应方块是通道,为1时表示对应方块为墙,如图3.3所示的迷宫,对应的迷宫数组mg如下: int mg[M+1][N+1]={ /*M=10,N=10*/ {1,1,1,1,1,1,1,1,1,1},

{1,0,0,1,0,0,0,1,0,1}, {1,0,0,1,0,0,0,1,0,1}, {1,0,0,0,0,1,1,0,0,1}, {1,0,1,1,1,0,0,0,0,1}, {1,0,0,0,1,0,0,0,0,1}, {1,0,1,0,0,0,1,0,0,1}, {1,0,1,1,1,0,1,1,0,1}, {1,1,0,0,0,0,0,0,0,1}, {1,1,1,1,1,1,1,1,1,1} }; 伪代码:

c语言描述如下: void mgpath() /*路径为:(1,1)->(M-2,N-2)*/ { int i,j,di,find,k; top++; /*初始方块进栈*/ Stack[top].i=1; Stack[top].j=1;

工艺流程图识图基础知识

工艺流程图识图基础知识 工艺流程图是工艺设计的关键文件,同时也是生产过程中的指导工具。而在这里我们要讲的只是其在运用于生产实际中大家应了解的基础知识(涉及化工工艺流程设计的内容有兴趣的师傅可以找些资料来看)。它以形象的图形、符号、代号,表示出工艺过程选用的化工设备、管路、附件和仪表等的排列及连接,借以表达在一个化工生产中物量和能量的变化过程。流程图是管道、仪表、设备设计和装置布置专业的设计基础,也是操作运行及检修的指南。 在生产实际中我们经常能见到的表述流程的工艺图纸一般只有两种,也就是大家所知道的PFD和P&ID。PFD实际上是英文单词的词头缩写,全称为Process Flow Diagram,翻译议成中文就是“工艺流程图”的意思。而P&ID也是英文单词的词头缩写,全称为Piping and Instrumentation Diagram,“&”在英语中表示and。整句翻译过来就是“工艺管道及仪表流程图”。二者的主要区别就是图中所表达内容多少的不同,PFD较P&ID内容简单。更明了的解释就是P&ID图纸里面基本上包括了现场中所有的管件、阀门、仪表控制点等,非常全面,而PFD图将整个生产过程表述明白就可以了,不必将所有的阀门、管件、仪表都画出来。 另外,还有一种图纸虽不是表述流程的,但也很重要即设备布置图。但相对以上两类图而言,读起来要容易得多,所以在后面只做简要介绍。 下面就介绍一下大家在图纸中经常看到的一些内容及表示方法。 1 流程图主要内容 不管是哪一种,那一类流程图,概括起来里面的内容大体上包括图形、标注、图例、标题栏等四部分,我们在拿到一张图纸后,首先就是整体的认识一下它的主要内容。具体内容分别如下: a 图形将全部工艺设备按简单形式展开在同一平面上,再配以连接的主、辅管线及管件,阀门、仪表控制点等符号。 b 标注主要注写设备位号及名称、管段编号、控制点代号、必要的尺寸数据等。 c 图例为代号、符号及其他标注说明。 d 标题栏注写图名、图号、设计阶段等。

c语言实现迷宫最优路径选择

中国计量学院实验报告 实验课程:算法与数据结构实验名称:迷宫的最优路径班级:学号: 姓名:实验日期:2013-5-20 一.实验题目: 输入一迷宫 查找并输出迷宫的最优路径 实验成绩:指导教师:

二.算法说明 1.定义一个结构体来表示起点和末点的坐标,定义一个数组来存放迷宫. struct elem { int x;//行 int y;//列 }; //定义结构体 int M[10][10]; 2.给数组中空白处赋上从起点到该处步骤的值. int find(int n) { for(i=0;i<9;i++) for(j=0;j<10;j++) { if(M[i][j]==n) { {if (M[i][j+1]==0) M[i][j+1]=n+1; else if(M[i][j+1]>n+1) M[i][j+1]=n+1;} {if (M[i+1][j]==0) M[i+1][j]=n+1; else if(M[i+1][j]>n+1) M[i+1][j]=n+1;} {if (M[i][j-1]==0) M[i][j-1]=n+1; else if(M[i][j-1]>n+1) M[i][j-1]=n+1;} {if (M[i-1][j]==0) M[i-1][j]=n+1; else if(M[i-1][j]>n+1) M[i-1][j]=n+1;} } } } 3.给最优路径附上特定的值,方便最后的输出. for (;;) { if(M[q.x+1][q.y]==(n-1)) {q.x++;M[q.x][q.y]=0;} else {if(M[q.x][q.y-1]==(n-1)) {q.y--;M[q.x][q.y]=0;} else {if(M[q.x-1][q.y]==(n-1)) {q.x--;M[q.x][q.y]=0;} else if(M[q.x][q.y+1]==(n-1)) {q.y++;M[q.x][q.y]=0;}}} n--; if(e.x==q.x&&e.y==q.y) {M[e.x][e.y]=0; break;} }

c语言迷宫问题的求解(栈和递归)

实验报告 【实验名称】项目一迷宫问题的求解 【实验目的】 1.了解栈的基本操作以及充分理解栈的特点。熟悉掌握栈的基本操作和结构体 的运用。 2.学会用栈或者递归方法解决迷宫问题。 【实验原理】 1.本次实验中,以二维数组maze[row][col]表示迷宫,0表示通路,1表示墙,在构建迷宫时,为了清晰显示,在最外层添加一圈墙。 2.算法的核心思想是利用栈后进先出的特点,对迷宫进行探索,如果此路可行,则将此坐标的信息入栈,如果此路不通,则将此坐标的信息出栈。 3.输入形式:根据控制台的提示,依次输入迷宫的行数、列数,然后输入迷宫,再输入入口和出口坐标。 4.输出形式:由用户选择,由递归、非递归两种求解方式输出一条迷宫通路。以非递归方式会显示一种求解方案,并给出相应的三元组序列和迷宫方阵;以递归方式则会显示出所有的路线。 【实验内容】 1.需求分析 (1)问题描述 以一个m*n的长方阵表示迷宫,0和1分别表示迷宫中的通路和障碍。设计一个程序,对任意设定的迷宫,求出一条从入口到出口的通路,或得出没有通路的结论。 要求以递归和非递归两种方式分别输出一条迷宫的通路,以带方向坐标和迷宫图像表示。

(2)基本要求 (1)首先实现一个以链表作存储结构的栈类型,然后编写一个求解迷宫的非递归程序。求得的通路以三元组(i,j,d)的形式输出。其中:(i,j)指示迷宫中的一个坐标,d表示走到下一坐标的方向。如,对于下列数据的迷宫,输出一条通路为:(1,1,1),(1,2,2),(2,2,2),(3,2,3),(3,1,2),…。 (2)编写递归形式的算法,求得迷宫中所有可能的通路。 (3)以方阵形式输出迷宫及其通路。 2.概要设计 (1)栈的抽象数据类型 ADT Stack{ 数据对象:D={ai|ai∈ElemSet, i=1,2, …,n, n≥0} 数据关系:R1={|ai-1,ai∈D, i=1,2, …,n } 约定an端为栈顶,a1端为栈底。 基本操作: InitStack( &S ) 操作结果:构造一个空栈S。 DestroyStack ( &S ) 初始条件:栈S已存在。 操作结果:销毁栈S。 ClearStack( &S ) 初始条件:栈S已存在。 操作结果:将S清为空栈。 StackEmpty( S ) 初始条件:栈S已存在。 操作结果:若S为空栈,则返回TRUE,否则返回FALSE。 StackLength( S ) 初始条件:栈S已存在。 操作结果:返回S的数据元素个数,即栈的长度。 GetTop( S, &e ) 初始条件:栈S已存在且非空。 操作结果:用e返回S的栈顶元素。 Push( &S, e ) 初始条件:栈S已存在。 操作结果:插入元素e为新的栈顶元素。 Pop( &S, &e ) 初始条件:栈S已存在且非空。 操作结果:删除S的栈顶元素,并用e返回其值。 }ADT Stack (2)程序模块

实验四:A星算法求解迷宫问题实验

实验四:A*算法求解迷宫问题实验 一、实验目的 熟悉和掌握启发式搜索的定义、估价函数和算法过程,并利用A*算法求解迷宫问题,理解求解流程和搜索顺序。 二、实验内容 迷宫问题可以表述为:一个二维的网格,0表示点可走,1表示点不可以走,点用(x,y)表示,寻找从某一个给定的起始单元格出发,经由行相邻或列相邻的单元格(可以通过的),最终可以到达目标单元格的、所走过的单元格序列。在任一个单元格中,都只能看到与它邻近的4个单元格(如果位于底边,则只有3个;位于4个角上,则只有2个是否能通过)。 A*算法是人工智能中的一种搜索算法,是一种启发式搜索算法,它不需遍历所有节点,只是利用包含问题启发式信息的评价函数对节点进行排序,使搜索方向朝着最有可能找到目标并产生最优解的方向。它的独特之处是检查最短路径中每个可能的节点时引入了全局信息,对当前节点距终点的距离做出估计,并作为评价节点处于最短路线上的可能性的度量。 A*算法中引入了评估函数,评估函数为:f(n)=g(n)+h(n)其中:n是搜索中遇到的任意状态。g(n)是从起始状态到n的代价。h(n)是对n到目标状态代价的启发式估计。即评估函数f ( n) 是从初

始节点到达节点n 处已经付出的代价与节点n 到达目标节点的接近程度估价值的总和。 这里我们定义n点到目标点的最小实际距离为h(n)*,A*算法要满足的条件为:h(n)<=h(n)* 迷宫走的时候只能往上下左右走,每走一步,代价为1,这里我们采用的估价函数为当前节点到目标节点的曼哈顿距离,即:h(n)=|end.x –n.x|+ |end.y –n.y| 这里end表示迷宫的目标点,n表示当前点,很明显这里h(n)<=h(n)*。 g(n)容易表示,即每走一步的代价是1,所以利用f(n)=g(n)+h(n)这种策略,我们可以不断地逼近目标点,从而找到问题的解。 时间复杂度:m行n列的迷宫矩阵实现算法的时间复杂度为O(m*n). 实验结果:

迷宫路径求解

计算机科学与技术专业《数据结构与算法》 课程设计报告 设计题目:迷宫路径求解专业: 学号: 姓名: 指导老师: 完成日期:

一、需求分析 迷宫路径求解:利用二维数组创建一个迷宫。编写一个算法能够完成输出走出迷宫的所有的路径。 二、设计概要 maze[9][11]={ {1,1,1,1,1,1,1,1,1,1,1}, {1,0,1,1,1,1,1,0,0,0,1}, {1,0,0,0,0,1,0,0,1,0,1}, {1,0,1,1,0,1,0,1,1,0,1}, {1,0,0,1,0,0,0,1,0,0,1}, {1,1,0,1,1,1,0,1,0,1,1}, {1,1,0,1,1,1,0,1,0,1,1}, {1,1,0,0,0,0,0,0,0,0,1}, {1,1,1,1,1,1,1,1,1,1,1} }; 一个迷宫用m*n的二维数组存储,用“0”代表可以通行,用“1”代表墙壁,不可通行。迷宫有一个路口和一个出口,设入口坐标为(x1,y1),出口坐标(x2,y2)。从迷宫的一个位置向东、南、西、北任意一个方向移动一步,前面若为“0”,则可前进一步,否则通行受阻,不能前进,则按顺时针改变为下一个方向。用一个switch语句控制方向的选择, 如: switch(d) {case 0:i=stack[s].i-1;j=stack[s].j;break; /*向西*/ case 1:i=stack[s].i;j=stack[s].j+1;break; /*向南*/ case 2:i=stack[s].i+1;j=stack[s].j;break; /*向东*/ case 3:i=stack[s].i;j=stack[s].j-1;break; /*向北*/ } 在走的同时需要用一个与迷宫同样大小的二维数组mark来存储走过的路径。避免重走已经走不通的老路。 为了寻找从入口点到出口点的一条通路,首先从入口点出发,按照四个方向的次序,当可以向前移动一步时,就把当前的的坐标入栈,若从当前位置无法继续前进时就做出栈操作,从上一次的位置的下一个方向,向前试探前进。如果当前位置为出口时,则表明找到一条路径从入口到出口的路径,打印出路径。若做出栈时为空,且当前位置不是出口,则表明没有找到一条可以出去的路径。结束程序。 三、详细设计 1.数据类型的定义; struct BinTreeNode { int i; int j; int d;

迷宫问题求解

课程设计报告 课题名称:迷宫问题的求解及演示姓名: 学号: 专业:计算机与信息学院 班级: 指导教师:

数据结构课程设计任务书针对本课程设计,完成以下课程设计任务书: 1.熟悉系统实现工具和上机环境。 2.根据课程设计任务,查阅相关资料。 3.针对所选课题完成以下工作: (1)需求分析 (2)概要设计 (3)详细设计 (4)编写源程序 (5)静态走查程序和上机调试程序 4.书写上述文档和撰写课程设计报告

目录 第一部分课程设计任务书 (1) 第二部分课程设计报告 (2) 第一章课程设计内容和要求 (4) 2.1 问题描述 (4) 2.2 需求分析 (4) 第二章课程设计总体方案及分析 (4) 3.1 概要设计 (7) 3.2 详细设计 (7) 3.3 调试分析 (10) 3.4 测试结果 (10) 第三章设计总结 (13) 4.1课程设计总结 (13) 4.2参考文献………………………………………………… 4.3 附录(源代码) (14)

第二部分课程设计报告 第一章课程设计内容和要求 2.1问题描述: 迷宫以16*16的矩阵存储在数据文件中(迷宫中的障碍物要占到一定比例),编写非递归的程序,求出一条从入口到出口的路径并显示之(结果若能用C的绘图函数显示更好) 2.2需求分析: 1.要求设计程序输出如下: (1) 建立一个大小为m×n的任意迷宫(迷宫数据可由用户输入或由程序自动生成),并在屏 幕上显示出来; (2)找出一条通路的二元组(i,j)数据序列,(i,j)表示通路上某一点的坐标。 (3)用一种标志(如数字8)在迷宫中标出该条通路; (4)在屏幕上输出迷宫和通路; (5)上述功能可用菜单选择。 2.迷宫的建立: 迷宫中存在通路和障碍,为了方便迷宫的创建,可用0表示通路,用1表示障碍,这样迷宫就可以用0、1矩阵来描述, 3.迷宫的存储: 迷宫是一个矩形区域,可以使用二维数组表示迷宫,这样迷宫的每一个位置都可以用其行列号来唯一指定,但是二维数组不能动态定义其大小,我们可以考虑先定义一个较大的二维数组maze[M+2][N+2],然后用它的前m行n列来存放元素,即可得到一个m×n的二维数组,这样(0,0)表示迷宫入口位置,(m-1,n-1)表示迷宫出口位置。

迷宫-最短路径及所有路径的问题

#include using namespace std; #define MAXSIZE 200 #define m 999 #define n 999 typedef struct { int i,j,di; }Queue; Queue Stack[MAXSIZE],Path[MAXSIZE];//栈和存放最短路径长度的数组 int top=-1,count=1,minlen=MAXSIZE;//栈顶指针,路径计数器,最短路径长度 const int move[4][2]={ {-1,0},{0,1},{1,0},{0,-1}}; int mark[m][n]; //标志数组 int maze[m][n]; //迷宫数组 int i1=1,j1=1,i2=10,j2=10,m1=11,n1=11; //入口,出口坐标,迷宫大小 void Init_maze(); //初始化系统自带迷宫 void NewCreat(); //新建迷宫 void Put_in(); //输入进出口

void PutOut_all(); //找所有路径和最短路径并输出所有路径 void PutOut_Grap(); //输出迷宫图形 void Migong(); //使用迷宫 void main() { cout<<"*******************欢迎使用迷宫系统 *******************\n"; while(1) { int i; cout<<"请选择你要的操作:\n" <<"1.使用系统自带迷宫\n" <<"2.使用新建迷宫\n" <<"0.退出\n"; cout<<"请输入:"; cin>>i; switch(i) { case 1: Init_maze();Migong();break; case 2: NewCreat();Migong();break; case 0: return;

工艺流程图识图基础知识

工艺流程图识图基础知识

工艺流程图识图基础知识 工艺流程图是工艺设计的关键文件,同时也是生产过程中的指导工具。而在这里我们要讲的只是其在运用于生产实际中大家应了解的基础知识(涉及化工工艺流程设计的内容有兴趣的师傅可以找些资料来看)。它以形象的图形、符号、代号,表示出工艺过程选用的化工设备、管路、附件和仪表等的排列及连接,借以表达在一个化工生产中物量和能量的变化过程。流程图是管道、仪表、设备设计和装置布置专业的设计基础,也是操作运行及检修的指南。 在生产实际中我们经常能见到的表述流程的工艺图纸一般只有两种,也就是大家所知道的PFD和P&ID。PFD实际上是英文单词的词头缩写,全称为Process Flow Diagram,翻译议成中文就是“工艺流程图”的意思。而P&ID也是英文单词的词头缩写,全称为Piping and Instrumentation Diagram,“&”在英语中表示and。整句翻译过来就是“工艺管道及仪表流程图”。二者的主要区别就是图中所表达内容多少的不同,PFD较P&ID内容简单。更明了的解释就是P&ID图纸里面基本上包括了现场中所有的管件、阀门、仪表控制点等,非常全面,而PFD图将整个生产过程表述明白就可以了,不必将所有的阀门、管件、仪表都画出来。 另外,还有一种图纸虽不是表述流程的,但

线,如蒸汽线、冷凝水线及上、下水管线等。 2 流程图中设备的表示方法 流程图上的设备都标注设备位号和名称,设备位号一般标注在两个地方。第一是在图的上方或下方,要求排列整齐,并尽可能正对设备,在位号线的下方标注设备名称;第二是在设备内或其近旁,此处仅注位号,不注名称。当几个设备或机器为垂直排列时,它们的位号和名称可以由上而下按顺序标注,也可水平标注。 工艺设备位号的编法是这样的:每个工艺设备均应编一个位号,在流程图、设备布置图和管道布置图上标注位号时,应在位号下方画一条粗实线,位号的组成如下图所示: 设备分类号 主项代号 设备顺序号 相同设备尾号 设备位号线 T - ×× ×× A 主项代号一般用两位数字组成,前一位数字表示装置(或车间)代号。后一位数字表示主项代号,在一般工程设计中,只用主项代号即可。装置或车间代号和主项代号由设计总负责人在开工报告中给定;设备顺序号用两位数字01、02、…、10、…表示;相同设备的尾号用于区别同一位号的相同设备,用英文字母A、B、C、……尾号表示。常用的设备分类代号见下表,一般用设备英文名称的首字母作代号。 常用设备分类代号

求迷宫中从入口到出口的路径的算法及实现概要

求迷宫中从入口到出口的 路径的算法及实现 涂海丽东华理工大学344000 1.本次设计所用到的库函数有:输入输出函数(stdio.h)过程调用函数(process.h)动态存储分配函数(malloc.h)。 2.本程序的设计过程分三大块:主程序(main())试探函数(search())数据子文件(input.c)。主要过程就是:通过主程序调用数据文件,然后用一维数组来模拟二维数组进行动态存储,再从第一个入口开始,调用试探函数探测通路,把探测到的通路入栈,进入下一层调用。直到找出所有的通路,最后打印输出。 for(i=-1i<=1++i)//在当前点的8各方向进行探测 for(j=-1j<=1++j){ih=i0+ijh=j0+jif((i!=0||j!=0)ih>=0ih<row&jh>=0jh<coltab[ih][jh]==0) {//判断条件ie1[ir]=ih//当前点入栈,进入下一层调用 ie2[ir]=jhtab[ih][jh]=1search(row,col,tab,ih,jh,ir+1,ie1,ie2,no)tab[i

h][jh]=0}}}main(){FILE*fpintrow,col,*tab1,**tab2,*ie1,*ie2,ir,no,i0,j0,i,jif((fp=fopen("input.c","r"))==NULL)//打开数据文件 {printf("TheopenError!")exit(0)}fscanf(fp,"%d%d",row,col)//读入迷宫的矩阵行和列大小 tab1=(int*)malloc((unsigned)col*row*sizeof(int))//申请动态存储区 tab2=(int**)malloc((unsigned)row*sizeof(int*))//tab1一维数组来模拟tab2二维 数组ie1=(int*)malloc((unsigned)col*sizeof(int))ie2=(int*)malloc((unsigned)col*sizeof(int))for(i=0i<row;i++)tab2[i]=(tab1[i*col])i0=0j0=0//从入口(1,1)开始for(i=0i<row;++i)for(j=0j<col++j)fscanf(fp,"%d",(tab2[i][j]))//读入矩阵的内容 fclose(fp)//存入到tab1中 三详细设计程序 #include<malloc.h> #include<stdio.h>#include<process.h>voidsearch(introw,intcol,int**tab,inti0,intj0,intir,int*ie1,int*ie2,int*no)//试探函数 {inti,jh,ih,j,countif(i0==row-1j0==col-1)//若能到达出口 {++(*no)//方法数加1 printf("#----------------The ̄ ̄ ̄ ̄[%d]th ̄ ̄ ̄ ̄ ̄Solution--------------------#\n",*no)//打印该种路径的出现顺序 printf("(%d,%d)",1,1)//从入口开始打印 count=0//输出换行计数

c语言程序设计 迷宫

数据结构课程设计_迷宫问题 /* Name:迷宫 Author:wujilin Description:输入时候一圈都应该是# 入口为(1,1) 如果有出口出口为(M-2,M-2) Date: 16-07-06 20:54 Copyright:wujilin */ #include #include #define M 10 //自己规定为10*10的迷宫 #define OK 1 #define ERROR 0 #define OVERFLOW -1 #define STACK_INIT_SIZE 100 #define STACKINCREMENT 10 int findway(int); int NextStep(int *, int *, int ); typedef struct { int x, y; //坐标 int dir; //方向 }ElemType; typedef struct StackNode//构造栈 { ElemType *base; ElemType *top; int stacksize; }SqStack; int InitStack(SqStack *S)//初始化栈 { S->base=(ElemType *)malloc(STACK_INIT_SIZE*sizeof(ElemType)); if(!S->base) { printf("memory allocation failed,goodbye"); exit(1); } S->top=S->base; S->stacksize=STACK_INIT_SIZE; return OK; }

c语言实现迷宫问题

c语言实现迷宫问题集团文件版本号:(M928-T898-M248-WU2669-I2896-DQ586-M1988)

数据结构试验——迷宫问题 (一)基本问题 1.问题描述 这是心理学中的一个经典问题。心理学家把一只老鼠从一个无顶盖的大盒子的入口处放入,让老鼠自行找到出口出来。迷宫中设置很多障碍阻止老鼠前行,迷宫唯一的出口处放有一块奶酪,吸引老鼠找到出口。 简而言之,迷宫问题是解决从布置了许多障碍的通道中寻找出路的问题。本题设置的迷宫如图1所示。 图1 迷宫示意图 迷宫四周设为墙;无填充处,为可通处。设每个点有四个可通方向,分别为东、南、西、北(为了清晰,以下称“上下左右”)。左上角为入口。右下角为出口。迷宫有一个入口,一个出口。设计程序求解迷宫的一条通路。 2.数据结构设计 以一个m×n的数组mg表示迷宫,每个元素表示一个方块状态,数组元素0和1分别表示迷宫中的通路和障碍。迷宫四周为墙,对应的迷宫数组的边界元素均为1。根据题目中的数据,设置一个数组mg如下int mg[M+2][N+2]= { {1,1,1,1,1,1,1,1}, {1,0,0,1,0,0,0,1},

{1,1,0,0,0,1,1,1}, {1,0,0,1,0,0,0,1}, {1,0,0,0,0,0,0,1}, {1,1,1,1,1,1,1,1} };在算法中用到的栈采用顺序存储结构,将栈定义为 Struct { int i; //当前方块的行号 int j; //当前方块的列号 int di; //di是下一个相邻的可走的方位号 }st[MaxSize];// 定义栈 int top=-1 //初始化栈 3设计运算算法 要寻找一条通过迷宫的路径,就必须进行试探性搜索,只要有路可走就前进一步,无路可进,换一个方向进行尝试;当所有方向均不可走时,则沿原路退回一步(称为回溯),重新选择未走过可走的路,如此继续,直至到达出口或返回入口(没有通路)。在探索前进路径时,需要将搜索的踪迹记录下来,以便走不通时,可沿原路返回到前一个点换一个方向再进行新的探索。后退的尝试路径与前进路径正好相反,因此可以借用一个栈来记录前进路径。 方向:每一个可通点有4个可尝试的方向,向不同的方向前进时,目的地的坐标不同。预先把4个方向上的位移存在一个数组中。如把

相关文档