鱼C论坛

 找回密码
 立即注册
12
返回列表 发新帖
楼主: Loser_YiMo

用C语言写出如下条件程序

[复制链接]
发表于 2021-5-12 13:42:32 | 显示全部楼层

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-5-12 21:35:13 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-5-12 23:25:28 | 显示全部楼层
本帖最后由 yuxijian2020 于 2021-5-12 23:33 编辑

工具人报到
太晚了,就弄了第一个
#include <stdio.h>
#include <string.h>
#include <stdlib.h>

//从 pos 开始往左 找到第一个 0值 在数组中的位置距离当前位置的距离
int LeftFindZero(int* box, int num, int pos)
{
        int cur = (pos - 1) < 0 ? num - 1 : pos - 1;
        int distance = 1;

        while (box[cur] != 0)
        {
                distance++;
                cur = (cur - 1) < 0 ? num - 1 : cur - 1;
        }

        return distance;
}
//从 pos 开始往右 找到第一个 0值 在数组中的位置距离当前位置的距离
int RightFindZero(int* box, int num, int pos)
{
        int cur = (pos + 1) < num ? pos + 1 : 0;
        int distance = 1;

        while (box[cur] != 0)
        {
                distance++;
                cur = (cur + 1) < num ? cur + 1 : 0;
        }

        return distance;
}
//优先向左边填充
int LeftFindNearestZeroAndSwap(int* box, int num, int pos)
{
        int leftZero = LeftFindZero(box, num, pos);
        int rightZero = RightFindZero(box, num, pos);
        int cur = 0;

        if (leftZero > rightZero)
        {
                cur = rightZero + pos >= num ? (rightZero + pos - num) : rightZero + pos;
                box[cur]++;
                box[pos]--;
                return rightZero;
        }
        else
        {
                cur = pos - leftZero < 0 ? (pos + num - leftZero) : pos - leftZero;
                box[cur]++;
                box[pos]--;
                return leftZero;
        }
}
//优先向右边填充
int RightFindNearestZeroAndSwap(int* box, int num, int pos)
{
        int leftZero = LeftFindZero(box, num, pos);
        int rightZero = RightFindZero(box, num, pos);
        int cur = 0;

        if (rightZero > leftZero)
        {
                cur = pos - leftZero < 0 ? (pos + num - leftZero) : pos - leftZero;
                box[cur]++;
                box[pos]--;
                return leftZero;
        }
        else
        {
                cur = rightZero + pos >= num ? (rightZero + pos - num) : rightZero + pos;
                box[cur]++;
                box[pos]--;
                return rightZero;
        }
}
//分发
int HandOut(int* box, int num)
{
        if (num <= 0) return 0;

        int left                = 0;                //左边
        int right                = 0;                //右边
        int leftCount        = 0;                //优先往左移动
        int rightCount        = 0;                //优先往右移动
        int count                = 0;                //返回值
        int* leftBox        = (int*)malloc(sizeof(int) * num);        //临时数组
        int* rightBox        = (int*)malloc(sizeof(int) * num);        //临时数组
        if (leftBox == NULL || rightBox == NULL) return 0;

        memset(leftBox, 0, sizeof(int) * num);
        memset(rightBox, 0, sizeof(int) * num);

        for (int i = 0; i < num; i++)
        {
                leftBox[i]        = box[i];
                rightBox[i] = box[i];
        }

        for (int i = 0; i < num; i++)
        {
                while (leftBox[i] > 1)
                        leftCount += LeftFindNearestZeroAndSwap(leftBox, num, i);
        }

        for (int j = num - 1; j >= 0; j--)
        {
                while (rightBox[j] > 1)
                        rightCount += RightFindNearestZeroAndSwap(rightBox, num, j);
        }

        free(leftBox);
        free(rightBox);

        count = leftCount > rightCount ? rightCount : leftCount;
        return count;
}

void OperatorCount()
{
        int t = 51;                //数据组数
        int N = 501;        //盒子数量 和 糖果的最大数量
        int** boxs;                //盒子
        int* result;        //结果
        //获取用户输入
        while (t < 0 || t > 50)
        {
                printf_s("本次输入几组数据?(0 <= t <= 50)\n");
                scanf_s("%d%*c", &t);
                if (t < 0 || t > 50)
                        printf_s("输入错误,请重新输入 t\n");
        }

        while (N < 1 || N > 500)
        {
                printf_s("共有几个盒子?(1 <= N <= 500)\n");
                scanf_s("%d%*c", &N);
                if (N < 1 || N > 500)
                        printf_s("盒子数量错误!请重新输入!\n");
        }
        //申请空间
        boxs = (int**)malloc(sizeof(int*) * t);
        if (boxs == NULL) return;                                        //判断是否申请成功
        for (int i = 0; i < t; i++)
        {
                boxs[i] = (int*)malloc(sizeof(int) * N);
                if (boxs[i] == NULL) return;
                memset(boxs[i], 0, sizeof(int) * N);
        }

        result = (int*)malloc(sizeof(int) * t);
        if (result == NULL) return;
        memset(result, 0, sizeof(int) * t);

        for (int i = 0; i < t; i++)
        {
                for (int j = 0; j < N; j++)
                {
                        printf_s("请输入第 %d 组 第 %d 个盒子中的糖果数量:", i, j);
                        scanf_s("%d", &boxs[i][j]);
                }
                result[i] = HandOut(boxs[i], N);
        }

        for (int i = 0; i < t; i++)
                printf_s("第 %d 组数据需要至少操作 %d 次\n", i, result[i]);

        free(result);
        for (int i = 0; i < t; i++)
                free(boxs[i]);
        free(boxs);
}

int main()
{
        OperatorCount();

        system("pause");
        return 0;
}
2.png
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-5-25 08:42:17 From FishC Mobile | 显示全部楼层
新鱼油不会
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-5-25 08:57:44 | 显示全部楼层
等我操作
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-5-25 17:15:51 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-5-26 14:23:24 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-5-26 17:35:33 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-6-1 14:33:07 From FishC Mobile | 显示全部楼层
我哇
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-6-1 16:28:57 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-6-3 14:57:03 From FishC Mobile | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-6-3 16:18:08 From FishC Mobile | 显示全部楼层
好多作业
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-6-6 11:01:18 From FishC Mobile | 显示全部楼层
不会
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-6-6 19:18:19 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-1-11 11:57

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表