您的位置:首页 > 其它

HDU 1172 猜数字 深搜

2015-09-08 21:32 316 查看
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 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;

}

思路比较好的是,都搜一遍然后看标记变量。都是同学教的,自己好渣啊。。。。。。。。。。。。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: