林尼的题目
随着原神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;
}
好了,到这里我们也就成功的解决了林尼的题目!
并且这也是本期的全部内容了,谢谢大家!!!