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
这题一看,给定的都是四位数,用暴力直接循环搜很划算。
我的思路:对于每组测试样例,枚举1000—9999的所有四位数,然后再对每个四位数进行验证(通过panduan函数验证),看是否满足测试样例所给的所有条件。如果不能唯一确定(一个都没有或者多于一个)那就输出Not sure
写完运行感觉没问题提交一遍过了就算了,代码格式啥的没太注意
#include<iostream>
#include<memory.h>
using namespace std;
const int maxn = 105;
int n;
int a[maxn];
int b[maxn];
int c[maxn];
int ax[5];
int ay[5];
int tag[5];
bool panduan(int x, int j)
{
memset(tag, 0, sizeof(tag));
int y = a[j];
ax[1] = x % 10; //个
x /= 10;
ax[2] = x % 10; //十
x /= 10;
ax[3] = x % 10; //百
x /= 10;
ax[4] = x; //千
ay[1] = y % 10;
y /= 10;
ay[2] = y % 10;
y /= 10;
ay[3] = y % 10;
y /= 10;
ay[4] = y;
int cnt1 = 0;
for(int i = 1;i <= 4;i++)
{
for(int k = 1;k <= 4;k++)
{
if(ax[i] == ay[k] && tag[k] != 1)
{
tag[k] = 1;
cnt1++;
break;
}
}
}
int cnt2 = (ax[1] == ay[1]) + (ax[2] == ay[2]) + (ax[3] == ay[3]) + (ax[4] == ay[4]);
if(cnt2 != c[j])
return false;
if(cnt1 != b[j])
return false;
return true;
}
int f()
{
int ans = 0; //记录满足的数
bool flag = true;
for(int i = 1000;i <= 9999;i++) //枚举所有的四位数
{
for(int j = 1;j <= n && flag;j++) //枚举所有的测试数据
{
if(!panduan(i, j))
{
flag = false;
}
}
if(flag == true)
{
if(ans == 0)
ans = i;
else
return 0;
}
else
flag = true;
}
return ans;
}
int main()
{
while(scanf("%d", &n), n != 0)
{
for(int i = 1;i <= n;i++)
{
cin >> a[i] >> b[i] >> c[i];
}
int res = f();
if(res != 0)
cout << res << endl;
else
cout << "Not sure" << endl;
}
return 0;
}
15MS, 还挺快的