
这里我使用了goto语句, 语法是:
goto label; // 跳转到指定的标签
label: // 标签定义
// 代码块
如果使用break的话只是跳出了内层循环,外层仍会继续循环,打乱排位顺序。但在实际项目开发中不建议使用goto语句,因为实际项目开发中要实现的功能多,使用多了goto会导致程序的控制流变得复杂,不利于代码维护。
另外我的代码中使用了getchar(),getchar() 是一个简单但强大的函数,适用于需要逐个字符读取输入的场景。由于scanf("%d",&t);处理完后,我们会输入回车进行字母输入,这时候会产生一个换行符“\n”,第一个ch =getchar();用于处理这个换行符,以免造成直接终止while循环。
#include<stdio.h>
int main()
{
int A,B,C,D,E,t,i,A1,B1,C1,D1,E1,cnt;
char ch;
//先用n重for循环,赋值数字去假设他们的排位,再根据“一半错一半对”的题目条件对排位名次进行分析 ,最后得出正确的排位名次
for(A=1;A<=5;A++){
for(B=1;B<=5;B++){
for(C=1;C<=5;C++){
for(D=1;D<=5;D++){
for(E=1;E<=5;E++){
//对每个选手说的话进行判断,一半正确一般错误,那么bool判断加起来就等于1
if( (B == 2) + (A == 3) == 1 &&
(B == 2) + (E == 4) == 1 &&
(C == 1) + (D == 2) == 1 &&
(C == 5) + (D == 3) == 1 &&
(E == 4) + (A == 1) == 1 && A*B*C*D*E==120 ){
//这里不用A+B+C+D+E==15来判断是因为有可能会出现1+3+3+3+5 == 15(假设)等等的情况
//找到正确排位名次,使用goto语句,跳出n层循环
goto out;
}
}
}
}
}
}
out: //goto语法的lable标签
scanf("%d",&t);
ch=getchar();//为了清除输入缓冲区中的换行符,确保后续的 while 循环能够正确执行
for(i=0;i<t;i++)
{
cnt=1;
while((ch=getchar())!='\n')//读取字符直到遇到换行符
{
if(ch!=' ')//空格不能算进去
{
switch(ch)//对人输入的每一个字母进行排位名次赋值
{
case 'A':A1=cnt;break;
case 'B':B1=cnt;break;
case 'C':C1=cnt;break;
case 'D':D1=cnt;break;
case 'E':E1=cnt;break;
}
cnt++;
}
}
// 如果系统判断的正确名次与输入的顺序相同,则输出YES
if(A1==A&&B1==B&&C1==C&&D1==D&&E1==E){
printf("YES\n");
}else{
printf("NO\n");
}
}
}
如果想要使用scanf("%c",&ch);的话可以写成这样:
out: //goto语法的lable标签
scanf("%d",&t);
ch=getchar();//仍要使用这个去处理换行符
for(i=0;i<t;i++)
{
cnt=1;
scanf("%c",&ch);
while(ch !='\n')
{
if(ch!=' ')//空格不能算进去
{
switch(ch)//对人输入的每一个字母进行排位名次赋值
{
case 'A':A1=cnt;break;
case 'B':B1=cnt;break;
case 'C':C1=cnt;break;
case 'D':D1=cnt;break;
case 'E':E1=cnt;break;
}
cnt++;
}
scanf("%c",&ch);
}
这道题其实跟“找好人”这道题十分类似,都是逻辑推理类题目,大家也可以看看我曾经写的“找好人”这道题目的解法:
1624

被折叠的 条评论
为什么被折叠?



