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 }

浙公网安备 33010602011771号