问题遇到的现象和发生背景
问题相关代码,请勿粘贴截图
#define _CRT_SECURE_NO_WARNINGS
#include "stdio.h"
#include "stdlib.h"
#define MAXSIZE 20000
int Max(int x, int y, int z, int w)
{
int p, q;
p = max(x, y);
q = max(z, w);
return max(p, q);
}
int main()
{
int n, p[MAXSIZE][3], bridge1, bridge2, m, u, v, x, cnt1, cnt2, cnt3, cnt4, status, result[100000];
scanf("%d", &n);
for (int i = 0; i < n; i++)
{
scanf("%d", &p[i][0]);
if (p[i][0] == 1) //设置该树对应的花期
{
p[i][1] = 1;
p[i][2] = 3;
}
if (p[i][0] == 2)
{
p[i][1] = 3;
p[i][2] = 4;
}
if (p[i][0] == 3)
{
p[i][1] = 4;
p[i][2] = 5;
}
if (p[i][0] == 4)
{
p[i][1] = 9;
p[i][2] = 10;
}
}
scanf("%d", &bridge1); //获取桥连接的两个点
scanf("%d", &bridge2);
scanf("%d", &m); //获取循环次数
for (int i = 0; i < m; i++)
{
cnt1 = 0; //计数器清0
cnt2 = 0;
cnt3 = 0;
cnt4 = 0;
scanf("%d", &x); //获取该次欣赏的季节
scanf("%d", &u); //获取该次的出发点
scanf("%d", &v); //获取该次的终止点
for (int t = u - 1; t < v; t++) //顺时针不走桥欣赏
{
if (x >= p[t][1] && x <= p[t][2])
cnt1++;
}
for (int t = u + 9; t >= v - 1; t--) //逆时针不走桥欣赏
{
if (x >= p[t % 10][1] && x <= p[t % 10][2])
{
cnt2++;
}
}
if (x >= p[v - 1][1] && x <= p[v - 1][2]) //顺时针走桥欣赏之前先判断终点的树是否开花
cnt3++;
for (int t = u - 1; t != v - 1;) //顺时针走桥欣赏(该循环不记录终点是否开花)
{
status = 0; //设置一开始为顺时针走
if (x >= p[t%10][1] && x <= p[t%10][2])
cnt3++;
if (t == bridge1 - 1) //逻辑位置和存储位置相差1
{
t = bridge2 - 1;
if (t < u && t > v)
{
if (t < u)
t += 10;
status = 1; //若过桥之后的点不在u和v之间,则开始逆时针走
}
}
if (t == bridge2 - 1)
{
t = bridge1 - 1;
if (t < u && t > v)
{
if (t < u)
t += 10;
status = 1; //若过桥之后的点不在u和v之间,则开始逆时针走
}
}
if (status == 0)
t++;
else
t--;
}
result[i] = Max(cnt1, cnt2, cnt3, cnt4);
}
for (int i = 0; i < m; i++)
{
if (result[i] != 0)
printf("%d\n", result[i]);
else
printf("So Sad.\n");
}
return 0;
}
运行结果及报错内容
希望大家能在我的代码上面进行改进和补充
我的解答思路和尝试过的方法
我的解题思路是求解每一条路径的开花树的数量,输出最大的那个数量。一共分为四条路径:顺时针不走桥,逆时针不走桥,顺时针走桥,逆时针走桥。目前已经实现了顺时针不走桥的路径和逆时针不走桥的路径,顺时针走桥的代码有问题,逆时针走桥的代码还没写。
我想要达到的结果
希望大家能帮忙看看