PtrRt move(PtrRt Rt,int pos[2],char store[][MaxCNum],int Llen,int Clen) { PtrRt temp; temp = (PtrRt)malloc(sizeof(struct Robot)); int i; temp->Pos[0] = pos[0]; temp->Pos[1] = pos[1]; temp->CTYPE = store[pos[0]][pos[1]]; int **a; a = around(temp->Pos); for(i=0;i<8;i++) { if((a[i][0]>-1)&&(a[i][0]<Llen)&&(a[i][1]>-1)&&(a[i][1]<Clen)) { temp->Around[i].CType = store[a[i][0]][a[i][1]]; temp->Around[i].flag = Judge(temp->Around[i].CType); } else{ temp->Around[i].CType = '0'; temp->Around[i].flag = 0; } } save_path(Rt,temp,Clen); return temp; }
时间: 2023-11-30 16:03:41 浏览: 30
这个函数的作用是将一个机器人从当前位置移动到指定位置,并返回移动后的机器人信息。
函数中,首先动态分配一个 `struct Robot` 类型的指针 `temp`,并将输入参数 `pos` 中的位置信息存储到 `temp` 中。接着获取指定位置周围格子的信息,并将这些信息存储到 `temp` 的 `Around` 数组中。
函数的最后一行调用 `save_path` 函数,将移动前的机器人 `Rt` 和移动后的机器人 `temp` 之间的路径存储到邻接矩阵中。最后返回移动后的机器人信息 `temp`。
相关问题
#ifndef FUNC_H_INCLUDED #define FUNC_H_INCLUDED #define MaxLNum 110 #define MaxCNum 110 #define MaxSize 10100 #define inf 10000 extern int arcs[MaxSize][MaxSize]; extern int s_nodes[MaxSize]; extern int g_nodes[MaxSize]; extern int dist[MaxSize]; extern int visited[MaxSize]; extern int pre[MaxSize]; extern int s_path[MaxSize][MaxSize]; extern int goal[MaxSize][2]; extern int s_vital[MaxSize][2]; //定义机器人(结构体)。 struct Robot{ int Pos[2]; //当前位置 char CTYPE; //当前的字符类型 struct ArEle{ char CType; int flag; }Around[8]; //周围结点的字符类型及其标记(从North开始,沿顺时针排列) }; typedef struct QNode* Queue; typedef struct Robot* PtrRt; typedef struct Node* PtrToNode; struct Node{ //队列中的结点 PtrRt Rt; PtrToNode Next; }; struct QNode { PtrToNode Front, Rear; // 队列的头、尾指针 }; Queue CreateQueue(); Queue AddQ( Queue Q, PtrRt Rt ); int IsEmpty( Queue Q ); PtrRt DeleteQ( Queue Q ); int** around(int pos[2]); int Judge(char c); void Record(PtrRt Rt,Queue Q,char expor[][MaxCNum]); PtrRt CreateRt(int x,int y,char store[][MaxCNum],int Llen,int Clen); void save_path(PtrRt Rt_1,PtrRt Rt_2,int Clen); PtrRt move(PtrRt Rt,int pos[2],char store[][MaxCNum],int Llen,int Clen); void BFS(PtrRt Rt,Queue Q,char store[][MaxCNum],char expor[][MaxCNum],int Llen,int Clen); void print_path(int path[],int u, int v,int Clen); void dijkstra(int begin,int nodes[],int Llen,int Clen); void Nicolas(char store[][MaxCNum],char expor[][MaxCNum],int Llen,int Clen); #endif // FUNC_H_INCLUDED解释代码
这段代码是一个头文件 func.h,定义了一些宏和函数声明,其中包括:
- MaxLNum:最大行数
- MaxCNum:最大列数
- MaxSize:最大节点数
- inf:一个无穷大的数
- arcs:二维数组,表示节点之间的边
- s_nodes:源节点集合
- g_nodes:目标节点集合
- dist:源节点到各个节点的最短距离
- visited:节点是否被访问过
- pre:节点在最短路径中的前驱节点
- s_path:源节点到所有节点的最短路径
- goal:目标节点的坐标
- s_vital:源节点的坐标
还定义了一个机器人的结构体,包括当前位置、字符类型和周围结点的字符类型及其标记。同时还定义了一个队列结构体 QNode 和一个节点结构体 Node,用于 BFS 算法中的队列操作。
在头文件中声明了一些函数:
- CreateQueue:创建队列
- AddQ:向队列中添加机器人节点
- IsEmpty:判断队列是否为空
- DeleteQ:从队列中删除机器人节点
- around:获取节点周围的节点
- Judge:判断字符类型
- Record:记录机器人节点信息
- CreateRt:创建机器人节点
- save_path:保存两个节点之间的最短路径
- move:移动机器人
- BFS:广度优先搜索算法
- print_path:打印最短路径
- dijkstra:Dijkstra 算法
- Nicolas:机器人走迷宫算法(主函数)
PtrRt CreateRt(int x,int y,char store[][MaxCNum],int Llen,int Clen) { PtrRt Rt; Rt = (PtrRt)malloc(sizeof(struct Robot)); int pos[2] = {x,y}; int** a = around(pos); Rt->Pos[0] = x; Rt->Pos[1] = y; Rt->CTYPE = store[x][y]; for(int i=0;i<8;i++) { if((a[i][0]>-1)&&(a[i][0]<Llen)&&(a[i][1]>-1)&&(a[i][1]<Clen)) { Rt->Around[i].CType = store[a[i][0]][a[i][1]]; Rt->Around[i].flag = Judge(Rt->Around[i].CType); } else{ Rt->Around[i].CType = '0'; Rt->Around[i].flag = 0; } } return Rt; }
这个函数是创建一个机器人的函数,输入参数包括机器人的位置 `(x, y)`,地图信息 `store`,以及地图的行数和列数 `Llen` 和 `Clen`。
函数中首先动态分配一个 `struct Robot` 类型的指针 `Rt`,然后根据输入的位置信息设置机器人的位置和类型,以及获取周围格子的位置信息。
接着使用循环遍历周围格子的位置信息,并获取对应格子的类型和标志。如果该格子在地图范围内,则将格子的类型和标志存储在 `struct Robot` 结构体中;否则将格子的类型存储为字符 `'0'`,标志存储为 0。最后返回 `Rt` 指针,即创建的机器人的信息。