为了账号安全,请及时绑定邮箱和手机立即绑定

暴力——猜数字(hdu1172)

标签:
算法

题目链接:

http://acm.hdu.edu.cn/showproblem.php?pid=1172

题目描述:

猜数字游戏是gameboy最喜欢的游戏之一。游戏的规则是这样的:计算机随机产生一个四位数,
然后玩家猜这个四位数是什么。每猜一个数,计算机都会告诉玩家猜对几个数字,其中有几个数字在正确的位置上。
比如计算机随机产生的数字为1122。如果玩家猜1234,因为1,2这两个数字同时存在于这两个数中,
而且1在这两个数中的位置是相同的,所以计算机会告诉玩家猜对了2个数字,其中一个在正确的位置。
如果玩家猜1111,那么计算机会告诉他猜对2个数字,有2个在正确的位置。
现在给你一段gameboy与计算机的对话过程,你的任务是根据这段对话确定这个四位数是什么。
Input
输入数据有多组。每组的第一行为一个正整数N(1<=N<=100),表示在这段对话中共有N次问答。
接下来的N行中,每行三个整数A,B,C。gameboy猜这个四位数为A,然后计算机回答猜对了B个数字,
其中C个在正确的位置上。当N=0时,输入数据结束。
Output
每组输入数据对应一行输出。如果根据这段对话能确定这个四位数,则输出这个四位数,若不能,则输出"Not sure"。


解题思路:暴力,就是暴力。

https://img1.sycdn.imooc.com//5b530c8b000117c801200112.jpg


/*暴力出奇迹,逆向试数 把所有的四位数都判断一遍,如果解=1,则输出,否则Not sure ,竟然能AC,我也是醉了*/ #include<stdio.h>int main(){	int a[110],b[110],c[110];      //a=问答中的数,b=猜对的个数,c=正确的数 	int i,s,k;                        //s所有的四位数	int n;                          //n次问答	int a1,a2,a3,a4;                 //s数中提取的四位数 	int b1,b2,b3,b4;                 //a[i]测试数中提取的四位数 	int bb,cc;                       //判断条件b和条件c 是否符合 	int e[11],d[11];                //记录该数出现次数,因为问答次数很多,需要更改数组和模版记录数组 	int z,j,l;                       //z为符合状态, j为符合的个数,l保存符合的数 	while(~scanf("%d",&n),n)	{	for(i=1;i<=n;i++)	scanf("%d%d%d",&a[i],&b[i],&c[i]);		j=0;	for(s=1000;s<=9999;s++)         //s从1000到9999开始暴力试数,题中说四位数,所以不算0开头 	{	 	z=1;                          //状态开始为合理(1) 	 	for(i=0;i<10;i++)             //d[i]记录s提取数出现的次数 先全部置零 	 	d[i]=0;	 		 	a4=s%10;                      //a4~a1为 s数中提取的四位数	a3=s/10%10;	a2=s/100%10;	a1=s/1000;		d[a1]++;                      //提取后,该数出现的次数进行累加 	d[a2]++;	d[a3]++;	d[a4]++;	/*  	    printf("%d~%d~%d~%d\n",a1,a2,a3,a4);	    for(i=0;i<10;i++)	 	printf("%d ",e[i]);	 	printf("\n");	  */	for(i=1;i<=n;i++)                  //开始测试n种问答是否合理 	{	    	bb=0;                          //b条件和c条件置零 	    	cc=0;	    	b4=a[i]%10;                    //提取测试数的四位数 	b3=a[i]/10%10;	b2=a[i]/100%10;	b1=a[i]/1000;	// printf("%d~%d~%d~%d\n",b1,b2,b3,b4);	for(k=0;k<10;k++)             //将模版d[i]赋值给e[i] 	e[k]=d[k];                    //因为e[i]每次循环都要复原,所以需要模版d[i] 	if(e[b1])                     //如果e[i]出现过,那么bb+1,同时e[i]本身次数-1 	{	        	bb++;	        	e[b1]--;	}	if(e[b2])	{	        	bb++;	        	e[b2]--;	}	if(e[b3])	{	        	bb++;	        	e[b3]--;	}	if(e[b4])	{	        	bb++;	        	e[b4]--;	}		if(a1==b1)                //c条件判断	cc++;	if(a2==b2)	cc++;	if(a3==b3)	cc++;	if(a4==b4)	cc++;	//printf("%d,%d\n",bb,cc);	if(bb!=b[i]||cc!=c[i])          //如果出现过不符合的情况,z状态=0,跳出本数的测试 	{	     	z=0;	     	break;	}	}	if(z)                              //如果经过所有的问答后,z状态还=1,该数符合条件 	{	   	l=s;                               //先记录先该数 	j++;                                //计算符合条件的总个数 }}//printf("%d\n",j);	if(j==1)                             //j只能等于1,若大于则答案不唯一,若=0则无解 	printf("%d\n",l);	else	printf("Not sure\n");}return 0;}


点击查看更多内容
TA 点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
  • 推荐
  • 评论
  • 收藏
  • 共同学习,写下你的评论
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
意见反馈 帮助中心 APP下载
官方微信

举报

0/150
提交
取消