林尼的题目
随着原神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;}
好了,到这里我们也就成功的解决了林尼的题目!
并且这也是本期的全部内容了,谢谢大家!!!
如果这篇文章对你有帮助,欢迎分享给更多人!
部分信息可能已经过时