猜数字游戏是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 Input6
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 Output3585
Not sure
思路:就是把1000到9999都搜一遍,如果标记变量为1就是唯一解,否则不是not sure;
AC代码:
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
int n;
struct point {
int a;
int b[4];//各个数位的数字
int sum;
int tol;
};
point tt[105];
int f[4];
int tag;
int ok;
void dfs(int x){
if(x>9999){
return;
}
f[0]=x%10;
f[1]=x/10%10;
f[2]=x/100%10;
f[3]=x/1000;
int hj;
for(int i=0;i<n;i++){
hj=0;
int c[5];
int aa=0,bb=0;//bb相同的数字并且数位相同,aa是相同的数字
memset(c,0,sizeof(c));
for(int j=0;j<4;++j){
if(tt[i].b[j]==f[j]){
bb++;
}
}
if(bb!=tt[i].tol){ hj=1; break;}
for(int j = 0;j < 4;j++){
for(int k = 0;k < 4;k++){
if(tt[i].b[k]==f[j]&&c[k]==0){
aa++;
c[k]=1;
break;
}
}
}
if(aa!=tt[i].sum){ hj=1;break; }
}
if(hj){dfs(x+1);}
else{
tag++;
ok=x;
dfs(x+1);
}
}
int main(){
while(scanf("%d",&n)!=EOF&&n){
for(int i = 0;i < n;i++){
scanf("%d%d%d",&tt[i].a,&tt[i].sum,&tt[i].tol);
tt[i].b[0]=tt[i].a%10;
tt[i].b[1]=tt[i].a/10%10;
tt[i].b[2]=tt[i].a/100%10;
tt[i].b[3]=tt[i].a/1000;
}
tag=0;
dfs(1000);
if(tag!=1){
printf("Not sure\n");
}
else{
printf("%d\n",ok);
}
}
return 0;
}
思路比较好的是,都搜一遍然后看标记变量。都是同学教的,自己好渣啊。。。。。。。。。。。。