武科大有沁湖,与黄家湖相连,是武科大的校内湖,湖中一座长桥连通南北两苑,武科大以沁湖为载体,每年举办汇湖龙舟赛、沁湖诗会、沁湖时光、沁讲登、汇湖鱼交海校园文化活动。记湖边上也裁有很多花,小明知道后就一直想去赏花。现在小明得知在记湖边上有几个点,这们个点以了到1顺时针为国 一益,a个点栽有一粮化财。有四种化树:梅化(化期1-3月)、楼化(化期3-4月)、白桶化(花期4-5月)、桂化(化期9-10月),每种化只任目己的花开花。小明给每个点标记一个值p,p的值表示改点是哪种花,1代表梅花,2代表楼花,3代表石楠花,4代表桂花。小明现在制定了m种观赏方案,每定一个月份z,在2月去第花,在由于汇湖太大,小明就选了湖边两个点山、!,想者就欣第从u到e沿途的花就好了,因为湖中有桥,现在他发现从u走到了几种不同的方式,他想知道沿途最多能看到多少裸树正在开花(走到一个点才能看见这个点的花是否开了,不能重复经过同一个I*: (1) 如地点用结构体类型 (至少包括和什么类型的花、是杏能吞到花) struct place int §_type;//1-4 int if open://0没开,开放 提示:利用malloc 建立动态数组 出发点和结束点考志在桥的同侧还是异侧。点)。
时间: 2023-11-15 13:06:24 浏览: 64
首先,我们可以将每个点的信息存储在一个结构体数组中,每个结构体包括花的类型和是否开放的信息。然后,对于每个月份z和起始点u,我们可以使用广度优先搜索算法来找到从起始点u到终点e的所有路径,并计算每条路径上能看到的最多裸树的数量。最后,我们返回所有路径中最多能看到的裸树的数量即可。
具体实现步骤如下:
1. 定义结构体类型来存储每个点的信息:
```
struct place {
int flower_type; // 1-4
int is_open; // 0-1
};
```
2. 根据输入数据,创建一个结构体数组来存储每个点的信息:
```
int n; // 点的数量
scanf("%d", &n);
struct place *places = (struct place*) malloc(sizeof(struct place) * n);
for (int i = 0; i < n; i++) {
int flower, is_open;
scanf("%d %d", &flower, &is_open);
places[i].flower_type = flower;
places[i].is_open = is_open;
}
```
3. 对于每个月份z和起始点u,使用广度优先搜索算法来找到从起始点u到终点e的所有路径,并计算每条路径上能看到的最多裸树的数量:
```
int m; // 观赏方案的数量
scanf("%d", &m);
while (m--) {
int z, u, e;
scanf("%d %d %d", &z, &u, &e);
u--; // 点的编号从0开始,需要减1
e--;
int max_naked_trees = 0;
// 广搜遍历所有可能的路径
for (int i = 0; i < n; i++) {
if (i == u || i == e) continue; // 起点和终点不能在路径上
if (places[i].flower_type == z && places[i].is_open) {
// 如果当前点的花和月份z一致,并且花开了,才进行搜索
int *visited = (int*) calloc(n, sizeof(int));
visited[i] = 1;
queue<int> q;
q.push(u);
int naked_trees = 0;
while (!q.empty()) {
int cur = q.front();
q.pop();
if (cur == e) break;
for (int j = 0; j < n; j++) {
if (j == cur || visited[j] || places[j].flower_type != z) continue;
int is_bridge = (cur < n / 2 && j >= n / 2) || (cur >= n / 2 && j < n / 2);
// 判断是否经过桥
if (is_bridge) continue;
visited[j] = 1;
q.push(j);
if (places[j].is_open) {
naked_trees += (places[j].flower_type == 2 || places[j].flower_type == 3);
// 如果当前点开了花,就计算能看到的裸树的数量
}
}
}
max_naked_trees = max(max_naked_trees, naked_trees);
free(visited);
}
}
printf("%d\n", max_naked_trees);
}
```
注意,在判断是否经过桥的时候,我们需要考虑起点和终点是否在桥的同侧或异侧,如果在同侧就不能经过桥,否则可以经过桥。
另外,为了防止重复访问同一个点,我们需要使用一个visited数组来记录每个点是否已经被访问过。在计算每条路径上能看到的裸树的数量时,我们只统计已经开了花的点中的楼花和石楠花。
阅读全文