Yester07 2022-05-30 18:15 采纳率: 48.5%
浏览 184
已结题

入门基础的算法题,求解

问题遇到的现象和发生背景

img

问题相关代码,请勿粘贴截图
#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;
}

运行结果及报错内容

希望大家能在我的代码上面进行改进和补充

我的解答思路和尝试过的方法

我的解题思路是求解每一条路径的开花树的数量,输出最大的那个数量。一共分为四条路径:顺时针不走桥,逆时针不走桥,顺时针走桥,逆时针走桥。目前已经实现了顺时针不走桥的路径和逆时针不走桥的路径,顺时针走桥的代码有问题,逆时针走桥的代码还没写。

我想要达到的结果

希望大家能帮忙看看

  • 写回答

2条回答 默认 最新

  • 三块不一样的石头 2022-05-30 19:37
    关注
    #include "stdio.h"
    #define MAXSIZE 500001
    bool flower(long hua,long season1);
    void shun(long head,long tail);                          // 正向走
    void ni(long head,long tail);                            // 反着走
    long N,M,p[MAXSIZE],bridge1,bridge2;                     // 养成一个习惯,关键循环字符用大写
    long season,start,end,flag,result;
    int main()
    {
        //  梅花1 (1-3), 樱花2 (3-4), 石兰花3 (4-5),桂花4 (9-10)
    
        scanf("%ld", &N);
        for (long i = 1; i <= N; i++)  scanf("%ld", &p[i]);      // 每个点花的读入
    
    
        scanf("%ld %ld %ld", &bridge1,&bridge2,&M);                     //获取桥连接的两个点,获取查询次数
    
        while (M--)
        {
            //  欣赏沿途的花不太清楚有没有包括start 跟 end 这俩点
            result = flag = 0;
    
            scanf("%ld %ld %ld",&season,&start,&end);
    
            //  顺时针不走桥欣赏
            shun(start,end);
            result = result>flag ? result : flag;
            flag=0;
    
            // 逆时针不走桥欣赏
            ni(start,end);
            result = result>flag ? result : flag;
            flag=0;
    
            // 走桥
            int f1=0,f2=0;
            if(bridge1>=start && bridge1<end) f1 = 1;
            if(bridge2>=start && bridge2<end) f2 = 1;
    
            if(f1+f2==1){  // 桥头一个在里一个在外
                long inside = f1==1 ? bridge1 : bridge2;                //  在范围内的桥头
                long outside = inside==bridge1 ? bridge2 : bridge1;     //  在范围外的桥头
    
                //  按start与end分2种情况讨论
    
                if(start<end){    // 出发地编号小于目的地
    
                    //  先去 inside
                    shun(start,inside);
                    ni(outside,end);
                    result = result>flag ? result : flag;
                    flag=0;
    
                    //  先去 outside
                    for(long z=start-1;z!=outside;z--);
                    ni(start,outside);
                    shun(inside,end);
                    result = result>flag ? result : flag;
                    flag=0;
                }else{
                    // 先去 inside
                    ni(start,inside);
                    shun(outside,end);
                    result = result>flag ? result : flag;
                    flag=0;
    
                    // 先去 outside
                    shun(start,outside);
                    ni(inside,end);
                    result = result>flag ? result : flag;
                    flag=0;
                }
    
            }
    
            if(result) printf("%ld\n",result);
            else printf("So Sad.\n");
        }
        return 0;
    }
    bool flower(long hua,long season1){
        if(hua==1 && season1>=1 && season1<=3 ) return true;
        if(hua==2 && season1>=3 && season1<=4 ) return true;
        if(hua==3 && season1>=4 && season1<=5 ) return true;
        if(hua==4 && season1>=9 && season1<=10) return true;
        return false;
    }
    void shun(long head,long tail){
        if(flower(p[head],season)) flag++;
        while (head!=tail){
            if(head==N) head=0;
            head++;
            if(flower(p[head],season)) flag++;
        }
        if(flower(p[tail],season)) flag++;
    }
    void ni(long head,long tail){
        if(flower(p[head],season)) flag++;
        while (head!=tail){
            head--;
            if(head==0) head=N;
            if(flower(p[head],season)) flag++;
        }
        if(flower(p[tail],season)) flag++;
    }
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录
查看更多回答(1条)

报告相同问题?

问题事件

  • 系统已结题 6月8日
  • 已采纳回答 5月31日
  • 赞助了问题酬金10元 5月30日
  • 创建了问题 5月30日

悬赏问题

  • ¥15 这种微信登录授权 谁可以做啊
  • ¥15 请问我该如何添加自己的数据去运行蚁群算法代码
  • ¥20 用HslCommunication 连接欧姆龙 plc有时会连接失败。报异常为“未知错误”
  • ¥15 网络设备配置与管理这个该怎么弄
  • ¥20 机器学习能否像多层线性模型一样处理嵌套数据
  • ¥20 西门子S7-Graph,S7-300,梯形图
  • ¥50 用易语言http 访问不了网页
  • ¥50 safari浏览器fetch提交数据后数据丢失问题
  • ¥15 matlab不知道怎么改,求解答!!
  • ¥15 永磁直线电机的电流环pi调不出来