百度astar复赛最后一题

复赛一共5道,这是最后一道。大家可以做做看!

 

第五题. 玉树驰援  ( 时限:120000ms )  
问题描述
4小时以前:青海玉树发生强烈地震,大量房屋倒塌,人员伤亡惨重。灾区急需救援。

2小时以前:政府迅速成立救灾指挥中心。全国各地情系玉树,纷纷筹集救援物资。

1小时以前:指挥中心将若干与玉树有直接或间接道路交通的地区作为集散点。救援物资分批就近到达集散点后,再由汽车运进灾区。一批物资有一个唯一的编号,并由若干个集装箱组成。集散点已有不同数量的汽车在等候,指挥中心可以根据需要进行运输调度。汽车装卸物资的时间可忽略不计。一辆汽车一次最多只能运1个集装箱。

30分钟以前:部分道路由于损坏和堵塞,汽车通行需要较长的时间;部分道路情况更加严重,已经不具备通车条件。指挥中心决定修复和疏通道路,使道路恢复通车,或缩短通行时间。施工需要一定的时间,而且要封闭道路,即在此过程中不能有汽车在该道路上行驶。足够数量的施工队已经待命,可以随时对多条道路进行施工。

现在(2010/4/14 11:49):你被紧急征召到指挥中心。你的任务是调度物资运输和道路施工,在最短的时间内将所有物资运送到玉树灾区。

输入格式
输入由三部分信息组成,依次为交通信息、汽车初始分布信息和物资就绪信息。相邻部分之间用一个空行(/n)隔开。

第一部分:玉树周边的交通信息。每行描述一条道路,格式如下:

地点A 地点B该道路施工所需小时数(t0) 施工前行驶所需小时数(t1) 施工后行驶所需小时数(t2)
值间以一个空格隔开。道路总数不超过256条,任意两地间最多只有一条双向道路直达。地点名为英文字母和数字组成的字符串,长度不超过7字节。玉树的地点名为"Yushu"。 t0, t1, t2为整数。如果t1 = -1,表示该条道路在施工完成前无法通车;其它情况下,t0,t1, t2均大于0且不大于24。

一个空行之后,是第二部分:汽车初始分布信息。每行描述某个集散点初始时有多少汽车在等候,格式如下:

地点 数量
值间以一个空格隔开。集散点总数不超过64,单个集散点汽车的初始数量不超过1024。

一个空行之后,是第三部分:物资就绪信息。每行描述一批物资在何时何地就绪,格式如下:

yyyy/mm/dd HH:MM arrive 地点 物资编号 集装箱数量
值间用一个空格隔开。其中,yyyy/mm/dd HH:MM的时间格式含义为:年/月/日 时:分。物资编号为英文字母和数字组成的字符串,长度不超过7字节。一批物资的集装箱数量不超过2048。

最后一部分以文件结束符结尾。

输入保证所有物资可以在有限时间内运到玉树。

输出格式
你的程序应当按时间顺序在标准输出上打印你下达执行的指令。每条指令一行(不超过255字节,以'/n'结尾),每行各值间用一个空格隔开。指令格式具体如下:

道路施工指令

yyyy/mm/dd HH:MM fix 地点A 地点B
该指令表示在指定时间开始对地点A和地点B的直达道路上进行施工。一条道路不得重复施工。

货物运输指令

yyyy/mm/dd HH:MM trans 地点A 地点B 物资编号:本指令运输的集装箱数量
该指令表示在指定时间开始将某种指定数量的物资从地点A运输到地点B。地点A和地点B必须有直达道路。集装箱数量应为正整数。

空车移动指令

yyyy/mm/dd HH:MM move 地点A 地点B 本指令调动的汽车数量
该指令表示在指定时间开始将指定数量汽车从地点A调度到地点B。地点A和地点B必须有直达道路。汽车数量应为正整数。

注意:所有指令涉及到的时间不得早于2010/4/14 11:49(但可以相等),所有指令一旦下达就不能取消或中断。

样例输入
Yushu A1 7 14 7
Yushu A2 2 -1 5
A2 A3 4 9 6

Yushu 3
A1 40
A2 5
A3 15

2010/4/14 11:59 arrive A2 G1 10

样例输出
2010/4/14 11:49 fix Yushu A2

2010/4/14 11:49 move A3 A2 5

2010/4/14 13:59 trans A2 Yushu G1:5

2010/4/14 20:49 trans A2 Yushu G1:5

评分方法
选取用时最短的选手,按此时间取所有选手的即时快照。按物资到达数量降序排序,第1名满分,其后按物资到达数量比给分。

注:如果没有一个选手完成运输,那么取所有选手的已完成量最大者,按其最后一批物资的到达时间取所有选手的即时快照。如果所有选手均没有将任何物资运送到玉树,则该测试点所有选手均得0分。

如果输出的指令及其运行不符合题目规定,相应测试点得0分。
 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 9
    评论
### 回答1: 我可以为您提供一段Astar算法的C语言代码:#include<stdio.h> #include<stdlib.h> #define MAX 20 int a[MAX][MAX],closed[MAX][MAX],open[MAX][MAX],x,y; int xp,yp,x0,y0,minf,i,j; void path(){ while(closed[xp][yp]!=1){ minf=999; for(i=x-1;i<=x+1;i++){ for(j=y-1;j<=y+1;j++){ if(a[i][j]<minf && closed[i][j]!=1){ minf=a[i][j]; x0=i; y0=j; } } } x=x0; y=y0; closed[x][y]=1; open[x][y]=1; } } int main(){ printf("Enter the no of rows and columns :\n"); scanf("%d%d",&xp,&yp); for(i=0;i<xp;i++){ for(j=0;j<yp;j++){ printf("Enter the cost of (%d,%d) node :\n",i,j); scanf("%d",&a[i][j]); closed[i][j]=0; open[i][j]=0; } } printf("Enter the coordinates of the starting node :\n"); scanf("%d%d",&x,&y); open[x][y]=1; printf("The Path is :\n"); path(); printf("(%d,%d)",x,y); i=x; j=y; do{ if(i-1>=0 && open[i-1][j]==1){ printf("(%d,%d)",i-1,j); i=i-1; } else if(j+1<yp && open[i][j+1]==1){ printf("(%d,%d)",i,j+1); j=j+1; } else if(i+1<xp && open[i+1][j]==1){ printf("(%d,%d)",i+1,j); i=i+1; } else if(j-1>=0 && open[i][j-1]==1){ printf("(%d,%d)",i,j-1); j=j-1; } }while(i!=x || j!=y); return 0; } ### 回答2: A*算法是一种经典的寻路算法,用于在图形化网格中找到最短路径。以下是用C语言实现A*算法的代码段。 ```c #include <stdio.h> #include <stdlib.h> #include <math.h> #define ROW 10 #define COL 10 typedef struct Node { int row, col; int g, h, f; struct Node* parent; } Node; typedef struct { Node* elements[ROW * COL]; int front; int rear; } Queue; Queue* create_queue() { Queue* queue = (Queue*)malloc(sizeof(Queue)); queue->front = 0; queue->rear = 0; return queue; } void enqueue(Queue* queue, Node* node) { queue->elements[queue->rear] = node; queue->rear++; } Node* dequeue(Queue* queue) { Node* node = queue->elements[queue->front]; queue->front++; return node; } int is_empty(Queue* queue) { return queue->front == queue->rear; } int heuristic(int x1, int y1, int x2, int y2) { return abs(x1 - x2) + abs(y1 - y2); } int isValid(int row, int col) { return row >= 0 && row < ROW && col >= 0 && col < COL; } int isObstacle(int grid[ROW][COL], int row, int col) { return grid[row][col] == 1; } void tracePath(Node* endNode) { Node* current = endNode; while (current != NULL) { printf("(%d, %d) ", current->row, current->col); current = current->parent; } } void aStar(int grid[ROW][COL], Node* start, Node* end) { int rowMoves[] = {-1, 0, 1, 0}; int colMoves[] = {0, 1, 0, -1}; int closedList[ROW][COL]; for (int i = 0; i < ROW; i++) { for (int j = 0; j < COL; j++) { closedList[i][j] = 0; } } Queue* openList = create_queue(); enqueue(openList, start); while (!is_empty(openList)) { Node* current = dequeue(openList); if (current->row == end->row && current->col == end->col) { printf("最短路径为: "); tracePath(current); return; } closedList[current->row][current->col] = 1; for (int i = 0; i < 4; i++) { int newRow = current->row + rowMoves[i]; int newCol = current->col + colMoves[i]; if (isValid(newRow, newCol) && !isObstacle(grid, newRow, newCol) && !closedList[newRow][newCol]) { Node* neighbor = (Node*)malloc(sizeof(Node)); neighbor->row = newRow; neighbor->col = newCol; neighbor->parent = current; neighbor->g = current->g + 1; neighbor->h = heuristic(newRow, newCol, end->row, end->col); neighbor->f = neighbor->g + neighbor->h; enqueue(openList, neighbor); } } } printf("找不到路径"); } int main() { int grid[ROW][COL] = { {0, 1, 0, 0, 0, 0, 1, 0, 0, 0}, {0, 1, 0, 1, 0, 0, 1, 0, 1, 0}, {0, 0, 0, 1, 0, 0, 0, 0, 1, 0}, {0, 1, 0, 1, 0, 1, 1, 0, 1, 0}, {0, 1, 0, 1, 0, 1, 0, 1, 0, 0}, {0, 1, 0, 0, 0, 1, 0, 1, 1, 0}, {0, 1, 0, 1, 0, 0, 0, 0, 1, 0}, {0, 1, 0, 1, 1, 1, 0, 1, 1, 0}, {0, 0, 0, 0, 0, 0, 0, 0, 1, 0}, {0, 0, 1, 1, 1, 1, 1, 1, 1, 0} }; Node* start = (Node*)malloc(sizeof(Node)); start->row = 0; start->col = 0; Node* end = (Node*)malloc(sizeof(Node)); end->row = 9; end->col = 9; aStar(grid, start, end); return 0; } ``` 这段代码实现了A*算法在一个10x10的网格中寻找路径。网格中1代表障碍物,0代表可通行区域。算法会输出从起点(0, 0)到终点(9, 9)的最短路径。 ### 回答3: A*算法是一种启发式搜索算法,常用于路径规划问题。在使用C语言编写A*算法时,需要实现以下几个关键的步骤: 1. 定义表示地图的数据结构:使用二维数组或类似的数据结构表示地图,其中不同的元素代表不同的地形或障碍物。 2. 定义表示节点的数据结构:每个节点需要包含位置坐标、代价函数值、启发函数值和指向父节点的指针等信息。 3. 实现代价函数和启发函数:代价函数用于评估从起始点到当前节点的代价,启发函数用于估计从当前节点到目标点的代价。 4. 初始化起始节点和目标节点:设置起始节点的坐标,并创建一个空的开放列表和关闭列表。 5. 将起始节点加入到开放列表中。 6. 重复以下步骤,直到开放列表为空或找到目标节点: a. 从开放列表中选择代价函数值最小的节点作为当前节点。 b. 将当前节点从开放列表中移除,并将其加入到关闭列表中。 c. 对当前节点的邻居节点进行遍历,计算其代价函数值和启发函数值,并更新节点信息。 d. 如果邻居节点已经在关闭列表中,跳过该节点。 e. 否则,如果邻居节点已经在开放列表中,并且新的路径代价更高,则跳过该节点。 f. 否则,将邻居节点加入到开放列表中,更新其父节点为当前节点。 7. 从目标节点开始,按照父节点指针一直追溯回起始节点,即可得到找到的最佳路径。 使用C语言实现A*算法需要灵活运用数据结构和指针操作,同时需要根据实际情况进行合理的优化,以提高算法的效率和性能。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值