选手的名次OJ

这里我使用了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);
		}

这道题其实跟“找好人”这道题十分类似,都是逻辑推理类题目,大家也可以看看我曾经写的“找好人”这道题目的解法:

https://blog.youkuaiyun.com/SRKkAI/article/details/143811730?spm=1001.2014.3001.5501icon-default.png?t=O83Ahttps://blog.youkuaiyun.com/SRKkAI/article/details/143811730?spm=1001.2014.3001.5501 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值