2024王道408数据结构 P93 T4

2024王道408数据结构 P93 T4

思考过程

  1. 首先看懂题目的意思,现在能载10辆车过江,车辆分为客车和货车两类。

    • 客车先上4辆。
    • 上完后才允许货车上一辆。
    • 如果等待的客车不足4辆则用货车补
    • 如果没有货车了就全上客车

其实这就已经把所有可能发生的情况都考虑到了。

  1. 我们需要一个目标队列ans用来放已经放在船上的车,一个队列h用来放货车,一个队列k用来放客车。其次我们需要一个变量j来记录目标队列ans上已经放了几辆车,一个变量i来记录客车数。

代码思路

明确了题目的意思就开始敲代码,这题分成四种情况上面已经都列举出来了,现在我们要转换成代码。

  • 第一种情况当i < 4 && !QueueEmpty(k)时,就是当已经放上去的客车小于4辆并且客车还有剩余,我们就往目标队列里放客车,也就是DeQueue(k, x);EnQueue(ans, x);用x来存放出队元素。最后记得计数器i++;j++;表示放上去了一辆客车,目标队列里多了一辆车。
  • 第二种情况就是当i == 4 && !QueueEmpty(h),也就是现在客车已经放上去四辆了并且现在还有剩余的货车,我们就往上放一辆货车就行了。DeQueue(h, x); EnQueue(ans,x);,就是把货车队列里的一辆车拉出来放进目标队列里了,最后也记得j++;i=0;这里j++表示目标队列又多了一辆车,把i重新赋值为0表示又能够继续放客车了。
  • 第三种情况就是现在已经没有四辆客车了,并且还有剩余货车,并且现在目标队列里的车还不满10辆,也就是i < 4 && !QueueEmpty(h) && j < 10),此时while循环用货车来补,DeQueue(h,x);EnQueue(ans,x)这种情况就是客车不足用货车补的情况,最后记得j++;i++;,j++表示目标队列的车又多一辆,i++则表示把货车当客车补了一辆。
  • 最后就是第四种情况,货车不够,让所有客车上船,这里我们在代码上直接i=0就可以了,因为把i重新赋值为0,此时程序就会重新往上寻找第一种情况,也就是又开始入客车了,当然用else if当然也可以。

此时四种情况全部判断完,如果目标车辆上的车还是不足10辆,j<10那我们就退出循环。

完整代码如下

//
// Created by 黎圣  on 2023/8/2.
//
#include "iostream"
#define MAX 10
struct Queue
{
    int f, r, tag;
    int data[MAX];
};
//判断栈空
bool QueueEmpty(Queue q)
{
    if (q.f == q.r && q.tag == 0)
        return true;
    return false;
}
//判断栈满
bool QueueOverflow(Queue &q)
{
    if (q.f == q.r && q.tag == 1)
        return true;
    return false;
}
//入栈
bool EnQueue(Queue &q, int x)
{
    if (QueueOverflow(q) == true)
    {
        printf("队满,入队失败\n");
        return false;
    }
    q.data[q.r] = x;
    q.r = (q.r + 1) % MAX;
    q.tag = 1;
    return true;
}
//出栈
bool DeQueue(Queue &q, int &x)
{
    if (QueueEmpty(q) == true)
    {
        printf("队空,出队失败\n");
        return false;
    }
    x = q.data[q.f];
    q.f = (q.f + 1) % MAX;
    q.tag = 0;
    return true;
}
//这个可以不用写出来,我们为了方便看结果所以把队列中的元素打印出来
void display(Queue q)
{
    while (!QueueEmpty(q))
    {
        printf("%d ", q.data[q.f]);
        q.f = (q.f + 1) % MAX;
        q.tag = 0;
    }
    printf("\n");
}

//题目主代码
void car()
{
	//目标队列ans用来存放已经放在船上的车
	//队列h用来放货车
	//队列k用来放客车
    Queue ans, k, h;
    ans.f = 0, ans.r = 0, ans.tag = 0;
    k.f = 0, k.r = 0, k.tag = 0;
    h.f = 0, h.r = 0, h.tag = 0;
    //这个也不用写出来,也是为了方便看结果所以赋个值
    for (int i = 0; i < MAX; i++)
    {
        EnQueue(k, 1);
        EnQueue(h, 2);
    }
    //变量j来记录目标队列ans上已经放了几辆车
    //变量i来记录客车数
    //x存放出队元素
    int i = 0;
    int j = 0;
    int x = 0;
    while (j < 10)
    {
        if (!QueueEmpty(k) && i < 4)//我先入4个客车
        {
            DeQueue(k, x);
            EnQueue(ans, x);
            j++;
            i++;
        }
        else if (i == 4 && !QueueEmpty(h))//入一辆货车
        {
            DeQueue(h, x);
            EnQueue(ans, x);
            j++;
            i = 0;
        }
        else//
        {
        	//已经没有四辆客车了,并且还有剩余货车,并且现在目标队列里的车还不满10辆,用货车补
            while (i < 4 && !QueueEmpty(h) && j < 10)
            {
                DeQueue(h, x);
                EnQueue(ans, x);
                j++;
                i++;
            }
            //货车不够,让所有客车上船
            i = 0;//此时程序就会重新往上进入第一个if,也就是又开始入客车了
        }
        if (QueueEmpty(h) && QueueEmpty(k))
            break;
    }
    //这个也不用写出来
    printf("客车队列");
    display(k);
    printf("货车队列");
    display(h);
    printf("目标队列");
    display(ans);
}
int main()
{
    car();
    return 0;
}

这题不算难,但是要把所有可能出现的情况给考虑全,最后感谢b站up主@吸血小金鱼,感谢美女姐姐

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值