HDU 1172 猜数字(暴力)

本文深入探讨了游戏开发中算法的应用,从基本的数学原理到高级的AI技术,包括数值计算、几何处理、物理模拟、路径寻优、碰撞检测、状态机设计、智能体行为、资源管理等关键环节。通过具体实例解析,展示了算法如何提升游戏体验和效率。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

猜数字

Time Limit: 20000/10000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 4053 Accepted Submission(s): 2334


Problem Description
猜数字游戏是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"。

Sample Input
6 4815 2 1 5716 1 0 7842 1 0 4901 0 0 8585 3 3 8555 3 2 2 4815 0 0 2999 3 3 0

Sample Output
3585 Not sure

Author

lwg


#include<iostream>
#include <string.h>
using namespace std;
const int N=100+5;
struct Node{
	int num,x1,x2;  
}node[N];
int f1[10];  //标记每个数字出现个数,这里要用Int  
int re[4];   //标记结果,若结果只有一个才对 
int main()
{  
    int n;
    int a[4],i,j;
    int  ok;
    while(cin>>n){
    	if(n==0)
    	   break;
    	ok=0; 
    	for(i=0;i<n;i++)
    	   cin>>node[i].num>>node[i].x1>>node[i].x2;
    	   
    	for(a[0]=0;a[0]<10;a[0]++)
    	  for(a[1]=0;a[1]<10;a[1]++)
    	    for(a[2]=0;a[2]<10;a[2]++)
    	       for(a[3]=0;a[3]<10;a[3]++){	//暴力四重  
			    	 	       
    	       	  for(i=0;i<n;i++){   //枚举每个提示 
    	       	  	
    	       	  	memset(f1,0,sizeof(f1));   	   //重新标记,为了判断   
    	         	
				   f1[a[0]]++;	
				   f1[a[1]]++;	
				   f1[a[2]]++;	
				   f1[a[3]]++;	 
				   
    	       		int sum1=0;  //看几个数猜对了  
					int sum2=0;  //看几个数的位置对了 
    	           	int tmp=node[i].num;
    	           for(j=3;j>=0;j--){
    	           	   if(f1[tmp%10])   //对的数字存在不 
    	           	   {
    	           	   	sum1++;
    	           	   	f1[tmp%10]--;
					   }	
					   if(tmp%10==a[j])   //位置对不 
					     sum2++;				  
					   tmp/=10;
				   }	
				   	if(sum1==node[i].x1&&sum2==node[i].x2){   //可以 继续判断 
					   }			   						   
				    else   //不行就跳出,这个组合是不行的 
					  break;
				} 
				if(i==n){   //所有都行 
				   ok++;
				   for(j=0;j<4;j++)   //保存结果 
				     re[j]=a[j];
				}
				 
			}
			  if(ok==1)   //只有一个答案才行 
			  {
			  	for(i=0;i<4;i++)
			  	  cout<<re[i];
			  	  cout<<endl;
			  }
			   else
			   cout<<"Not sure"<<endl;   	
	}
	return 0;
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值