您的位置:首页 > 其它

hdu 1172

2016-07-25 10:31 169 查看

题目概述

电脑产生一个四位数,人去猜,每次猜电脑会反馈猜对几个数,其中有几个数位置也正确,给出人猜的数和电脑反馈结果,问是否可确定这个数,若可以,求出这个数

时限

10000ms/20000ms

输入

第一行正整数N,其后N行,每行一个4位整数,为人猜的数,一个1位整数,为猜对的个数,一个1位整数,为位置也正确的个数,输入以N=0结束

限制

1<=N<=100

输出

在一行中输出,若可确定,输出这个数,否则输出Not sure

样例输入

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

讨论

暴搜,额实在没有想到什么更好的方法,实际上作为一个人类额都无法直接根据给出的那6行猜出这个数,于是换个思路,对所有四位数,看看和每次猜的数相比有几位存在,有几位位置相同,如果最后只有一个满足所有条件,便可确定,所幸数据可能水点了,运行时间还是很可观的

不过题目描述有一个坑,从样例第一组第5条可以看到,猜的8585,应该有4位猜对,结果返回3,由此说明答案中的每个数只能被“猜对”一次

题解状态

46MS,1732K,1256 B,C++

题解代码

set<int>avail;//available
struct state//每次人机对话的结构
{
int n, a, b;//猜的数 对的数 位置也正确的数
}states[MAXN];
bool check(int num, state a)//检查是否满足人机对话条件
{
int wa[4] = { num / 1000 , num / 100 % 10 ,num / 10 % 10 , num % 10 }, wb[4] = { a.n / 1000 ,a.n / 100 % 10 , a.n / 10 % 10, a.n % 10 };//wa是暴搜的数的4位 wb是人机对话时猜的数的4位
bool found[4] = {};//为了应对题目的坑 答案中每个数只能被猜对一次
int cnta = 0, cntb = 0;//猜对的个数 位置正确的个数
for (int p = 0; p < 4; p++) {
if (wa[p] == wb[p])
cntb++;//位置正确
for (int i = 0; i < 4; i++) {
if (wa[i] == wb[p] && !found[i]) {//猜对并且不曾被“猜对”过
cnta++;
found[i] = 1;
break;
}
}
}
return cnta == a.a&&cntb == a.b;//两条都完全相同 返回1
}
void fun(int N)
{
for (int p = 0; p < N; p++)
scanf("%d%d%d", &states[p].n, &states[p].a, &states[p].b);//input
for (int p = 0; p < 10000; p++) {
bool no = 0;//不符合某次人机对话结果
for (int i = 0; i < N&&!no; i++)
if (!check(p, states[i]))
no = 1;
if (!no)
avail.insert(p);//若都符合 加入可行解中
}
if (avail.size() == 1)
printf("%d\n", *avail.begin());//output//仅有1个可行解 就是他了
else
printf("Not sure\n");//output//否则不确定
}
int main(void)
{
//freopen("vs_cin.txt", "r", stdin);
//freopen("vs_cout.txt", "w", stdout);

int N;
while (~scanf("%d", &N) && N) {//input
fun(N);
avail.clear();//注意需要清零
}
}


EOF
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: