c语言写现在小明得知在沁湖边上有n个点,这n个点从1到n顺时针为围成一圈,每个点栽有一颗花树。有四种花树:梅花(花期1-3月)、樱花(花期3-4月)、石楠花(花期4-5月)、桂花(花期9-10月),每种花只在自己的花期 开花。小明给每个点标记一个值p;, P;的值表示改点是哪种花,1代表梅花,2代表樱花,3代表石楠花,4代表桂花。小明现在制定了m种观赏方案,每次选定一个月份x,在x月去赏花,在由于沁湖太大,小明就选了湖边两个点u、V,想着就欣赏从u到v沿途的花就好了,因为湖中有桥,现在他发现从u走到v有了几种不同的方式,他想知道沿途最多能看到多少棵树正在开花(走到一个点才能看见这个点的花是否开了,不能重复经过同一个点)。 Input 多组测试数据 对于每组数据: 输入n,下一行输入n个数p1,P2,... ,Pn。(2≤n≤10,1≤Pi ≤ 4)。 接下来输入两个数p,q表示这两点之间有一-座桥 (1 ≤p,q≤n,p!=q)。输入m,接下来输入m行,每行包括,u,v。(1≤m≤10,1≤x≤ 12,1< u,v≤n,u!=v) Output 对于m种观赏方案,每次输出能看到的最多的正在开花的树的数量,若数量为零输出so sad.每次输出占一行。 要求: (1)如地点用结构体类型(至少包括种什么类型的花、是否能看到花) struct place { int f_type;//1-4 int if_open;//0没开,开放 };
时间: 2024-02-20 18:56:48 浏览: 97
c语言输出字符串中最大对称子串长度的3种解决方案
好的,以下是C语言的实现代码,代码中使用了结构体place表示每个点的花的种类和是否能看到花的状态:
```c
#include <stdio.h>
#include <stdlib.h>
typedef struct {
int f_type; // 1-4,表示花的种类
int if_open; // 0表示没开,1表示开放
} place;
place p[11];
int can_see(int u, int v, int x, int n) {
// 初始化所有点的状态
for (int i = 1; i <= n; i++) {
p[i].if_open = 0;
}
// 开始移动,并更新点的状态
int cur = u;
while (cur != v) {
if (cur == u) {
if (x == 12 || x < 3) {
if (p[cur].f_type == 1) {
p[cur].if_open = 1;
}
}
} else {
if (x == 12 || x < 3) {
if (p[cur].f_type == 1) {
p[cur].if_open = 1;
}
} else if (x == 3) {
if (p[cur].f_type == 2) {
p[cur].if_open = 1;
}
} else if (x == 4) {
if (p[cur].f_type == 3) {
p[cur].if_open = 1;
}
} else if (x == 9 || x == 10) {
if (p[cur].f_type == 4) {
p[cur].if_open = 1;
}
}
}
cur = (cur % n) + 1;
}
// 统计能够看到的最多开放的花的数量
int cnt = 0;
cur = u;
while (cur != v) {
if (p[cur].if_open == 1) {
cnt++;
}
cur = (cur % n) + 1;
}
if (cnt == 0) {
printf("so sad.\n");
} else {
printf("%d\n", cnt);
}
return 0;
}
int main() {
int n, m, u, v, x, p, q;
while (scanf("%d", &n) != EOF) {
for (int i = 1; i <= n; i++) {
scanf("%d", &p[i].f_type);
}
scanf("%d%d", &p, &q);
scanf("%d", &m);
for (int i = 0; i < m; i++) {
scanf("%d%d%d", &x, &u, &v);
can_see(u, v, x, n);
}
}
return 0;
}
```
需要注意的是,每个点的编号从1到n,需要用取模操作来实现循环移动。另外,每个点的状态需要在每次观赏方案开始时进行初始化,否则会影响到之前的观赏方案。如果最多能看到的开放花的数量为0,则需要输出“so sad.”。
阅读全文