HDU1172 暴力水

猜数字

Time Limit: 20000/10000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 2722    Accepted Submission(s): 1585

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一一比对,符合条件个数为num,num>1输出Not sure ;num==1输出数字;num==0什么也不输出。

思路有了代码就很好写了。

代码:

 1 #include <cstdio>
 2 #include <algorithm>
 3 #include <cstring>
 4 #include <iostream>
 5 #include <queue>
 6 #include <vector>
 7
 8 using namespace std;
 9
10 queue<int>Q;
11
12 int pd(int num1,int x,int y,int num){
13     int n1, n2;
14     n1=n2=0;
15     int a[4], b[4], c1[10], c2[10];
16     memset(c1,0,sizeof(c1));
17     memset(c2,0,sizeof(c2));
18     int i, f1, f2;
19     f1=f2=1;
20     for(i=0;i<4;i++){
21         a[i]=num1%10;
22         c1[a[i]]++;
23         num1/=10;
24     }
25     for(i=0;i<4;i++){
26         b[i]=num%10;
27         c2[b[i]]++;
28         num/=10;
29     }
30     for(i=0;i<4;i++){
31         if(a[i]==b[i]) n1++;
32     }
33     for(i=0;i<10;i++){
34         n2+=min(c1[i],c2[i]);
35     }
36     if(n2==x&&n1==y) return 1;
37     else return 0;
38 }
39
40 main()
41 {
42     int n, i, j, k;
43     int x, y, z, num, size;
44     while(scanf("%d",&n)==1&&n){
45         scanf("%d %d %d",&x,&y,&z);
46         while(!Q.empty()) Q.pop();
47         for(i=1000;i<=9999;i++){
48             if(pd(x,y,z,i)) Q.push(i);
49         }
50         n--;
51         while(n--){
52             scanf("%d %d %d",&x,&y,&z);
53             size=Q.size();
54             if(size==0) continue;
55             while(size--){
56                 num=Q.front();
57             //    printf("%d ",num);
58                 Q.pop();
59                 if(pd(x,y,z,num)) Q.push(num);
60             }
61         //    cout<<endl<<endl;
62         }
63         if(Q.size()==1) printf("%d\n",Q.front());
64         else if(Q.size()==0) continue;
65         else printf("Not sure\n");
66     }
67 }
时间: 2024-10-10 09:07:59

HDU1172 暴力水的相关文章

UVA 10200 Prime Time 暴力水题

一个简单的暴力水题,只是输出方式让人无语... #include <stdio.h> #include <string.h> int prime(int n) { int i; for(i=2;i*i<=n;i++) { if((n%i)==0) return 0; } return 1; } int main() { int num[10010]; int i; int a,b; int sum; memset(num,0,sizeof(num)); for(i=0;i&l

HDU-2504-又见GCD(Java强行暴力水过!)

又见GCD Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 12371    Accepted Submission(s): 5257 Problem Description 有三个正整数a,b,c(0<a,b,c<10^6),其中c不等于b.若a和c的最大公约数为b,现已知a和b,求满足条件的最小的c. Input 第一行输入一个n

hdu 3687 10 杭州 现场 H - National Day Parade 暴力水题

H - National Day Parade Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u Submit Status Practice HDU 3687 Appoint description:  System Crawler  (2014-11-08) Description There are n×n students preparing for the National Day

“玲珑杯”ACM比赛 Round #18 A 暴力水 C dp

“玲珑杯”ACM比赛 Round #18 计算几何你瞎暴力 题意:如果从一个坐标为 (x1,y1,z1)的教室走到(x2,y2,z2)的距离为 |x1−x2|+|y1−y2|+|z1−z2|.那么有多少对教室之间的距离是不超过R的呢? tags:坐标范围很小,瞎暴力 #include<iostream> #include<cstdio> #include<cstdlib> #include<algorithm> #include<cstring>

HDU 1081 To The Max

题目链接 Problem Description Given a two-dimensional array of positive and negative integers, a sub-rectangle is any contiguous sub-array of size 1 x 1 or greater located within the whole array. The sum of a rectangle is the sum of all the elements in th

UVALive - 6910 (离线逆序并查集)

题意:给处编号从1~n这n个节点的父节点,得到含有若干棵树的森林:然后再给出k个操作,分两种'C x'是将节点x与其父节点所连接的支剪短:'Q a b'是询问a和b是否在同一棵树中. 题解:一开始拿到题目绞尽脑汁咋都想不到哇该怎么做在线查询,,,除了用暴力外一脸懵逼(不过确实能用暴力水过...=_=); 正解就是将其逆序离线处理: 先根据k个查询去掉所有要剪去的边后将剩余的边进行并查集处理,然后将k个查询逆序地处理查询结果:如果是剪边操作,则是将该节点与父节点并起来.  另外要注意的是,同一条边

HDU 4902 线段树||暴力

给定一个序列,两种操作 1:把一段变成x. 2:把一段每个数字,如果他大于x,就变成他和x的gcd,求变换完后,最后的序列. 线段树解法:用lazy标记下即可,优化方法还是很巧妙的, Accepted 4902 515MS 3308K 1941 B C++ #include "stdio.h" #include "string.h" struct node { int l,r,x;// 在叶子节点代表值,树节点代表成端更新的lazy操作. }data[400010]

CodeVS 1432-总数统计

原题 题目描述 Description 给出n个数,统计两两之和小于k的方案数之和. 输入描述 Input Description 第一行一个数n,表示数字的个数:第二行到第n + 1行,每行一个不超过2,000,000,000的数k:第n + 2行一个数m,表示m个问题:第n + 3行到第n + m + 2行,每行一个数m,询问表示n中两两组合不超过m的组合的个数: 输出描述 Output Description 输出m行,每行对应一个答案 样例输入 Sample Input 3 1 2 3

HDU 5839 Special Tetrahedron

暴力水过,数据水. #pragma comment(linker, "/STACK:1024000000,1024000000") #include<cstdio> #include<cstring> #include<cmath> #include<algorithm> #include<vector> #include<map> #include<set> #include<queue>