直接暴力就能过(真的没想到)
注意一下not sure不是找不到解,而是有多个解
在判断相同数字个数时,找到一个相同的就跳出内层循环,并标记一下那个数字的位置,这个位置指的是题目给出的四位数中处于数字的第几位
for(int i=0;i<4;i++)
{
for(int j=0;j<4;j++)
{
if(!vis[j]&&an[y].str[j]==num[i])
{
vis[j]=1;
cntnum++;
break;
}
}
}
猜数字游戏是gameboy最喜欢的游戏之一。游戏的规则是这样的:计算机随机产生一个四位数,然后玩家猜这个四位数是什么。每猜一个数,计算机都会告诉玩家猜对几个数字,其中有几个数字在正确的位置上。
比如计算机随机产生的数字为1122。如果玩家猜1234,因为1,2这两个数字同时存在于这两个数中,而且1在这两个数中的位置是相同的,所以计算机会告诉玩家猜对了2个数字,其中一个在正确的位置。如果玩家猜1111,那么计算机会告诉他猜对2个数字,有2个在正确的位置。
现在给你一段gameboy与计算机的对话过程,你的任务是根据这段对话确定这个四位数是什么。
比如计算机随机产生的数字为1122。如果玩家猜1234,因为1,2这两个数字同时存在于这两个数中,而且1在这两个数中的位置是相同的,所以计算机会告诉玩家猜对了2个数字,其中一个在正确的位置。如果玩家猜1111,那么计算机会告诉他猜对2个数字,有2个在正确的位置。
现在给你一段gameboy与计算机的对话过程,你的任务是根据这段对话确定这个四位数是什么。
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
3585 Not sure
#include<stdio.h>
#include<string.h>
struct list
{
char str[10];
int b;
int c;
}an[105];
int cmp(int x,int y)
{
int cntpos=0,cntnum=0,vis[10]={0};
char num[10]={0};
sprintf(num,"%d",x);
for(int i=0;i<4;i++)
{
for(int j=0;j<4;j++)
{
if(!vis[j]&&an[y].str[j]==num[i])
{
vis[j]=1;
cntnum++;
break;
}
}
}
if(cntnum!=an[y].b)
return 0;
if(an[y].str[0]==num[0])
cntpos++;
if(an[y].str[1]==num[1])
cntpos++;
if(an[y].str[2]==num[2])
cntpos++;
if(an[y].str[3]==num[3])
cntpos++;
if(cntpos!=an[y].c)
return 0;
return 1;
}
int main()
{
int n;
while(scanf("%d",&n),n)
{
int flag=-1,ans=0;
memset(an,0,sizeof(an));
for(int i=0;i<n;i++)
{
scanf("%s %d %d",an[i].str,&an[i].b,&an[i].c);
}
for(int i=1000;i<10000;i++)
{
for(int j=0;j<n;j++)
{
if(cmp(i,j))
{
if(j==n-1)
{
flag++;
ans=i;
}
}
else
break;
}
if(flag>0)
break;
}
if(flag)
printf("Not sure\n");
else
printf("%d\n",ans);
}
return 0;
}