用C语言解答林尼的题目

林尼的题目

随着原神4.0的推出,旅行者们的二创内容又打开了新的领域,今天我们来看看这道来自原神的二创题目,如下:在这里插入图片描述

分析

1.我们可以用数组来代表酒的类型,用数值来代表不同的瓶子,例如:
我们可以用’1’来代表甲;用’2’来代表乙;用’3’来代表丙;用’4’来代表丁;
用arr[1]来代表蒲公英酒;用arr[2]来代表苹果酿;用arr[3]来代表枫达;用arr[4]来代表假日果酿;

1==甲 , 2==乙 , 3 ==丙 , 4==丁
arr[1]==蒲公英酒 , arr[2]==苹果酿 ,  arr[3]==枫达 ,  arr[4]==假日果酿

所以我们在这最后打印结果的时候可以这样写:

void answer(int* arr,int n)
{
   switch (n)
   {
   case 1:
   	printf("甲为");
   	break;
   case 2:
   	printf("乙为");
   	break;
   case 3:
   	printf("丙为");
   	break;
   case 4:
   	printf("丁为");
   	break;
   }
   switch (arr[n])
   {
   case 1:
   	printf("蒲公英酒\n");
   	break;
   case 2:
   	printf("苹果酿\n");
   	break;
   case 3:
   	printf("枫达\n");
   	break;
   case 4:
   	printf("假日果酿\n");
   	break;
   }
}

2.接着我们由题目可以知道瓶中为"4"(即为假日果酿)时标签为假,所以我们可以尝试用循环来假定不同瓶子对应假日果酿的结果,而且为了方便瓶子的数字与饮料的数字对应我们可以这样开头,如下:

#include<stdio.h>
#include<time.h>
#include<stdlib.h>
int main()
{
   int guess = 0;
   srand((unsigned int)time(NULL));
   int arr[5] = { 0 };
   for (guess = 1; guess < 5; guess++)
   {
   		*(arr + guess) = 4;
		//主要执行内容.......
   }
   		return 0;
}

3.在我们做好准备工作后,下面我们来研究一下主要执行内容,这里分为两个部分:
其一为对应填补,也就是让不同瓶子对应不同的饮料;
其二为判断部分,这个环节要判断上一步的对应关系是否满足题目条件;

a. 在第一部分中,我们要让除了装有"4"的瓶子以外的瓶子随机排入"1",“2”,“3”,并且他们的值不能相同,所以代码可以这样写:

int n = 1;
		while (n)
		{
			for (int i = 1; i < 5; i++)
			{
				if (i == guess)
				{ }
				else
					*(arr + i) = rand() % 3 + 1;
			}
			int count = 0;
			for (int i = 0; i < 4; i++)
				if (arr[i] != arr[1 + i] && arr[1] != arr[3] && arr[1] != arr[4] && arr[2] != arr[4])
					count++;
			if (count == 4)
				n--;
		}

这样写我们就可以在不影响for循环猜想的瓶子情况下,来填补其他瓶子。

b.我们再来看看题目中的条件:
在这里插入图片描述
所以我们可以得出:
甲对应–>(arr[2]==1);
乙对应–>(arr[3]!=1);
丙对应–>(arr[4]==3);
而这里的丁比较有意思,因为他的对与错似乎也难以判断瓶中的饮料,但是如果他错也就意味着前三个都对并且他为"4",所以我们可以知道:
丁对应–>((arr[2] == 1) + (arr[3] != 1) + (arr[4] == 3)!=3);
又因为我们这里用的是 rand 来填补第一部分的空瓶,所以我们需要一直循环直到遇见正确答案为止,因此我们也要在循环末尾加上这个:

	if (guess == 4)
			guess = 1;

第二部分判断代码如下:

		int brr[4] = { (arr[2] == 1) , (arr[3] != 1) , (arr[4] == 3) ,((arr[2] == 1) + (arr[3] != 1) + (arr[4] == 3)!=3)};
		if ( brr[0] + brr[1] + brr[2] + brr[3] == 3)
			for (int jud = 1; jud <= 4; jud++)
				if (brr[jud - 1] == 0 && arr[jud] == 4)
				{
					for (int name = 1; name < 5; name++)
						answer(arr, name);
					return;
				}
		if (guess == 4)
			guess = 1;

OK!到这里就分析完了,下面我们来看看答案吧!

答案

小编将所有的代码整合后,代码及其运行程序如下:

#include<stdio.h>
#include<time.h>
#include<stdlib.h>
 answer(int* arr,int n)
{
	switch (n)
	{
	case 1:
		printf("甲为");
		break;
	case 2:
		printf("乙为");
		break;
	case 3:
		printf("丙为");
		break;
	case 4:
		printf("丁为");
		break;
	}
	switch (arr[n])
	{
	case 1:
		printf("蒲公英酒\n");
		break;
	case 2:
		printf("苹果酿\n");
		break;
	case 3:
		printf("枫达\n");
		break;
	case 4:
		printf("假日果酿\n");
		break;
	}
}
int main()
{
	int guess = 0;
	srand((unsigned int)time(NULL));
	int arr[5] = { 0 };
	for (guess = 1; guess < 5; guess++)
	{
		*(arr + guess) = 4;
		int n = 1;
		while (n)
		{
			for (int i = 1; i < 5; i++)
			{
				if (i == guess)
				{ }
				else
					*(arr + i) = rand() % 3 + 1;
			}
			int count = 0;
			for (int i = 0; i < 4; i++)
				if (arr[i] != arr[1 + i] && arr[1] != arr[3] && arr[1] != arr[4] && arr[2] != arr[4])
					count++;
			if (count == 4)
				n--;
		}
		int brr[4] = { (arr[2] == 1) , (arr[3] != 1) , (arr[4] == 3) ,((arr[2] == 1) + (arr[3] != 1) + (arr[4] == 3)!=3)};
		if ( brr[0] + brr[1] + brr[2] + brr[3] == 3)
			for (int jud = 1; jud <= 4; jud++)
				if (brr[jud - 1] == 0 && arr[jud] == 4)
				{
					for (int name = 1; name < 5; name++)
						answer(arr, name);
					return;
				}
		if (guess == 4)
			guess = 1;
	}
	return 0;
}

在这里插入图片描述
好了,到这里我们也就成功的解决了林尼的题目!
并且这也是本期的全部内容了,谢谢大家!!!

  • 14
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 5
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

蒋志昂

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值