枚举 hdu1172 猜数字

来源:互联网 发布:java中object类的方法 编辑:程序博客网 时间:2024/06/10 06:41

因为时间给的非常多,然后测试组数又很小,所以是一个很粗暴的模拟


只要从1000到9999枚举答案,然后再判断符合答案的个数,看个数的数量差不多就做完了

然后就在于如何判断有几个数字同时存在,我的思路是用vis1和vis2分别记录进行比较的两个数字中,每个数字出现的次数

那么如果对于某个数字,vis1[i]和vis2[i]都不等于0,就说明有min(vis1[i],vis2[i])个数字同时存在


还有把,,就是,,突然爱上宏定义了,,本来刚开始的时候写了一大堆的for,后来发现用For的写法,写起来真轻松!


#include<cstdio>#include<cmath>#include<cstring>#include<queue>#include<vector>#include<functional>#include<algorithm>using namespace std;typedef long long LL;typedef pair<int, int> PII;const int MX = 1000 + 5;const int INF = 0x3f3f3f3f;#define For(i,x,y) for(int i=x;i<=y;i++)#define mem(x,y) memset(x,y,sizeof(x))/***************************************/int A[MX], B[MX], C[MX];int vis1[100], vis2[100];void get(int x, int w[]) {    For(i, 0, 3) {        w[i] = x % 10;        x /= 10;    }}bool check(int x, int n) {    int a[4], s[4];    get(x, a);    For(i, 0, 3) vis1[a[i]]++;    For(id, 1, n) {        get(A[id], s);        For(i, 0, 3) vis2[s[i]]++;        int c1 = 0, c2 = 0;        For(i, 0, 9) {            if(vis1[i] && vis2[i]) {                c1 += min(vis1[i], vis2[i]);            }        }        For(i, 0, 3) c2 += (a[i] == s[i]);        For(i, 0, 3) vis2[s[i]] = 0;        if(B[id] != c1 || C[id] != c2) {            For(i, 0, 3) vis1[a[i]] = 0;            return false;        }    }    For(i, 0, 3) vis1[a[i]] = 0;    return true;}int main() {    int n;    while(~scanf("%d", &n), n) {        mem(vis1, 0);        mem(vis2, 0);        For(i, 1, n) {            scanf("%d%d%d", &A[i], &B[i], &C[i]);        }        int cnt = 0, ans;        For(i, 1000, 9999) {            if(check(i, n)) {                cnt++;                ans = i;            }        }        if(cnt == 1) {            printf("%d\n", ans);        } else {            printf("Not sure\n");        }    }    return 0;}


0 0
原创粉丝点击