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; }
时间: 2024-01-12 17:03:48 浏览: 114
这个函数是创建一个机器人的函数,输入参数包括机器人的位置 `(x, y)`,地图信息 `store`,以及地图的行数和列数 `Llen` 和 `Clen`。
函数中首先动态分配一个 `struct Robot` 类型的指针 `Rt`,然后根据输入的位置信息设置机器人的位置和类型,以及获取周围格子的位置信息。
接着使用循环遍历周围格子的位置信息,并获取对应格子的类型和标志。如果该格子在地图范围内,则将格子的类型和标志存储在 `struct Robot` 结构体中;否则将格子的类型存储为字符 `'0'`,标志存储为 0。最后返回 `Rt` 指针,即创建的机器人的信息。
相关问题
#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:机器人走迷宫算法(主函数)
void Record(PtrRt Rt,Queue Q,char expor[][MaxCNum]) { expor[Rt->Pos[0]][Rt->Pos[1]] = Rt->CTYPE; } //创建一个机器人 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;解释代码
这段代码包含两个函数。
第一个函数 `Record` 的作用是记录机器人的位置和类型到一个二维字符数组 `expor` 中。
第二个函数 `CreateRt` 的作用是创建一个机器人,并将其位置、类型以及周围格子的类型和标志存储在一个 `struct Robot` 结构体中。函数中先通过传入的参数 `x` 和 `y` 确定机器人的位置,然后通过调用 `around` 函数获取机器人周围格子的位置,再通过遍历周围格子的位置,获取周围格子的类型和标志,最终将这些信息存储在 `struct Robot` 结构体中,并返回该结构体的指针。
阅读全文