欢迎光临散文网 会员登陆 & 注册

0090-方法越来越妙!你能想到最优策略救下最多人吗?| 囚徒帽子逻辑谜题

2023-08-22 20:16 作者:氵军xig  | 我要投稿

0090 囚徒帽子逻辑谜题


11:45


程序效果图:

original array 为随机带的帽子颜色

sum array 为看到的帽子颜色对应数字求和

rem array 为求和后对帽子颜色数量求余

answer array 为囚徒回答帽子的颜色

由图可见,第一个报数的牺牲了自己保全了前n个人


代码如下:

~~~

#include<stdio.h>

#include<stdlib.h>

#include<time.h>


void print_arr(int *arr, int n)

{

    printf(": ");

    for(int i = 0; i < n; i++)

    {

        printf("%d ", arr[i]);

    }

    printf("\n");

}


int main(int argc, char const *argv[])

{

    int n, i;

    int number;

    printf("input people number :");

    scanf("%d", &number);

    printf("input hat color quantity :");

    scanf("%d", &n);


    int *array = (int *)malloc(sizeof(int) * number);

    // 自动生成

    srand(time(0));

    for(int i = 0; i < number; i++)

    {

        array[i] = rand() % n;  // n 上面得

    }


    // 手输数字

    // printf("input number: ");

    // for (i = 0; i < number; i++)

    // {

    //     scanf("%d", &array[i]);

    // }


    printf("\n");

    printf("original array");

    print_arr(array,number);

    printf("\n");


    // 前面n-1-i个人帽子数求和

    int *arr = (int *)malloc(sizeof(int) * number - 1);

    int sum = 0;

    for (int i = number - 1; i > 0; i--)

    {

        sum += array[i];

        arr[i-1] = sum;

    }

    printf("sum array");

    print_arr(arr, number - 1);


    // 前面n-1-i个人帽子求和 取 帽子颜色的模

    int *arr_0 = (int *)malloc(sizeof(int) * number - 1);

    for (int i = number - 1; i > 0; i--)

    {

        arr_0[i-1] = arr[i-1]%n;

    }

    printf("rem array");

    print_arr(arr_0, number - 1);


    // 算法算出自身帽子颜色

    int *arr_1 = (int *)malloc(sizeof(int) * number);

    // 最先报颜色到倒数第二个报颜色算法,听到帽子颜色 - 看到帽子颜色(求和求余)

    arr_1[0] = arr_0[0];

    for (int i = 1; i < number - 1; i++)

    {

        arr_1[i] = (arr_0[i-1] - arr_0[i] + n)%n ;

    }

// 最后一个报颜色算法

    int temp = arr_1[0];

    for (int i = 1; i < number - 1; i++)

    {

        temp = (temp - arr_1[i] + n)%n;

    }

    arr_1[number - 1] = temp;


    printf("answer array");

    print_arr(arr_1, number);


    free(array);

    free(arr);

    getchar();

    system("pause");

    return 0;

}

~~~

0090-方法越来越妙!你能想到最优策略救下最多人吗?| 囚徒帽子逻辑谜题的评论 (共 条)

分享到微博请遵守国家法律