You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C语言开发水排序谜题:如何从数组随机取元素填充另一数组

解决水排序谜题游戏的随机颜色填充问题

先梳理你代码里的核心问题,再给出可直接运行的完整方案:

  1. 变量名不统一:你定义了colrs和bottles数组,但打印逻辑用的是glasses,这会导致编译错误,需要先统一变量名。
  2. 颜色数组定义冗余:单个颜色用char类型即可,不需要三维数组,改用一维数组存储所有待分配颜色更简洁。
  3. 缺失随机填充逻辑:需要用洗牌算法打乱颜色序列,再填充到瓶子数组中,同时预留空位置。

完整实现代码

#include <stdio.h>
#include <stdlib.h>
#include <time.h>

int main() {
    // 定义所有待分配的颜色:4组r、y、b,共12个
    char colors[12] = {'r', 'y', 'b', 'r', 'y', 'b', 'r', 'y', 'b', 'r', 'y', 'b'};
    // 5个瓶子,每个4层,共20个位置,空位置用空格填充
    char glasses[20];
    int i, j;

    // 初始化随机种子,保证每次运行生成不同的随机布局
    srand(time(NULL));

    // Fisher-Yates洗牌算法:公平打乱颜色数组
    for (i = 11; i > 0; i--) {
        j = rand() % (i + 1);
        // 交换两个元素位置
        char temp = colors[i];
        colors[i] = colors[j];
        colors[j] = temp;
    }

    // 填充瓶子数组:前12个位置放打乱后的颜色,剩余8个位置放空(空格)
    for (i = 0; i < 12; i++) {
        glasses[i] = colors[i];
    }
    for (; i < 20; i++) {
        glasses[i] = ' ';
    }

    // 按你期望的格式打印瓶子布局
    printf("|%c| |%c| |%c| |%c| |%c|\n", glasses[0], glasses[4], glasses[8], glasses[12], glasses[16]);
    printf("|%c| |%c| |%c| |%c| |%c|\n", glasses[1], glasses[5], glasses[9], glasses[13], glasses[17]);
    printf("|%c| |%c| |%c| |%c| |%c|\n", glasses[2], glasses[6], glasses[10], glasses[14], glasses[18]);
    printf("|%c| |%c| |%c| |%c| |%c|\n", glasses[3], glasses[7], glasses[11], glasses[15], glasses[19]);
    printf("+-+ +-+ +-+ +-+ +-+");

    return 0;
}

关键逻辑说明

  • 随机种子初始化:srand(time(NULL))用当前时间作为随机种子,避免每次运行生成完全相同的瓶子布局。
  • Fisher-Yates洗牌:这是一种高效且公平的数组打乱算法,能确保每个颜色被分配到任意位置的概率均等。
  • 数组填充:根据你给出的期望输出,设置12个有颜色的位置、8个空位置,符合水排序游戏的常见初始布局。
  • 打印逻辑:保持你原本的打印格式,每个瓶子的4层对应数组中连续的4个元素,空位置用空格填充,输出效果与你期望一致。

内容的提问来源于stack exchange,提问作者mehmet enes çetin

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.07 07:35:23