Master-Mind Hints Uva340

题目概述:

  实现一个经典"猜数字游戏"。给定答案序列和用户猜的序列,统计有多少数字位置正确(A),有多少数字再两个序列都出现过但位置不对(B)。

 

自己的思路:先找对应位置相等,登记次数A,在用比较法找出相同数不同位置的。其中还涉及到了如果在答案序列位置i,和猜测序列位置j两个不同的位置,其数字相同,

那么应该先查看位置j对应的答案序列是否相同,再做其他考虑。自己的方法太繁琐了,自己还给自己挖坑。

书上的思路:找出两个序列位置相同数字相同的数量,之后再统计每个数字在两个序列出现的次数c1,c2。min(c1,c2)就是对数字B的贡献最后减去A的部分。

自己的代码:

 1 //Master-Mind Hints
 2 
 3 
 4 #include<stdio.h>
 5 #define MAX 1010
 6 int a[MAX][2];
 7 
 8 
 9 
10 int main(){
11     int n;
12     scanf("%d",&n);
13 
14     int Case=1;
15     while(n){
16         for(int i=0;i<n;i++)
17             scanf("%d",&a[i][0]);
18 
19         int sign=1;
20         while(1){
21             for(int j=0;j<n;j++)
22             scanf("%d",&a[j][1]);
23 
24 
25             int T=0,C=0;
26 
27 
28             for(int i=0;i<n;i++){
29                 for(int j=0;j<n;j++){
30                     if(a[j][1]==-1)
31                     continue;
32 
33                     if(a[i][0]==a[i][1]){//对应位置相等直接登记后跳出循环
34                         T++;
35                         break;
36                     }
37                     else if(a[i][0]==a[j][1]){//若不是对应位置相等,应该先判断a[j][1]对应的a[j][0]是否相等
38                         if(a[j][1]==a[j][0])
39                         continue;
40                         C++;
41                         a[j][1]=-1;
42                         break;
43                     }
44 
45                 }
46             }
47 
48             if(sign==1){//对一次猜数输出Game
49                 sign=0;
50                  printf("Game %d:\n",Case);
51             }
52             
53            int k=0;
54             for(int i=0;i<n;i++){//数组全为0表示退出
55                 if(a[i][1]==0)
56                 k++;
57             }
58             if(k==n)
59             break;
60 
61 
62             printf("    (%d,%d)\n",T,C);
63         }
64 
65         
66         Case++;
67         scanf("%d",&n);
68     }
69 
70     
71 
72     return 0;
73 }
自己的代码

 

 

书上的代码:

 

 1 //Master-Mind Hints Uva340
 2 
 3 #include<stdio.h>
 4 #define maxn 1010
 5 
 6 int main(){
 7     int n,a[maxn],b[maxn];
 8     int kase=0;
 9     while(scanf("%d",&n)==1&&n){
10         printf("Game %d\n",++kase);
11         for(int i=0;i<n;i++)scanf("%d",&a[i]);
12         for(;;){
13             int A=0,B=0;
14             for(int i=0;i<n;i++){
15                 scanf("%d",&b[i]);
16                 if(a[i]==b[i])A++;
17             }
18             if(b[0]==0)break;
19             for(int d=1;d<=9;d++){//统计不同数字的数量,取最小的那一组,再减去位置相同的数量
20                 int c1=0,c2=0;
21                 for(int i=0;i<n;i++){
22                     if(a[i]==d)c1++;
23                     if(b[i]==d)c2++;
24                 }
25                 if(c1<c2)B+=c1;else B+=c2;
26             }
27             printf("    (%d,%d)\n",A,B-A);
28         }
29     }
30     return 0;
31 }

 

posted @ 2020-08-02 11:02  MurphyVan  阅读(68)  评论(0)    收藏  举报