UVa 340 Master-Minds Hints(猜数字游戏的提示)

来源:互联网 发布:淘宝到家是干嘛的 编辑:程序博客网 时间:2024/04/30 04:50
//给定答案序列和用户猜的序列,统计有多少数字位置正确(A),有多少数字在两个序列都出现过但位置不对(B)//输入有多组测试。每组输入第一行为序列长度n,第二行是答案序列,接下来是多行猜测序列猜测序列全0该组数据结束。n=0时结束输入#include <stdio.h>#include <stdlib.h>#include <ctype.h>#include <string.h>int compare(int number,int keycopy[],int length){    for(int i=0;i<length;i++)        if(number==keycopy[i]){           keycopy[i]=0;//对应过的不能再用           return 1;        }    return 0;}int main(){    int n;    int *key;//正确    int *guess;//猜测    int *keycopy;//复制一遍key    int count1=0,count2=0;    int times=0;    while(scanf("%d",&n)&&n){         printf("Game %d:\n",++times);         int flag=1;         key=(int *)malloc(sizeof(int)*n);         guess=(int *)malloc(sizeof(int)*n);         keycopy=(int *)malloc(sizeof(int)*n);         for(int i=0;i<=n-1;i++)            scanf("%d",&key[i]);         while(flag){//flag为1才说明上次输入不是全零              flag=0;              count1=count2=0;              memcpy(keycopy,key,sizeof(int)*n);              for(int i=0;i<=n-1;i++){                 scanf("%d",&guess[i]);                 if(guess[i]!=0)                    flag=1;                 if(guess[i]==key[i]){                     count1++;                     guess[i]=0;//对应过的不能再用   由题意,key和guess均无0                     keycopy[i]=0;//对应过的不能再用                 }              }              for(int i=0;i<=n-1;i++)                 if(guess[i]&&compare(guess[i],keycopy,n))                       count2++;              if(flag)                 printf("    (%d,%d)\n",count1,count2);         }    }    return 0;}/*// UVa340 Master-Mind Hints// Rujia Liu//直接统计A,为了求B,对于每个数字0~9,统计二者出现的次数c1和c2,min(c1,c2)就是该数字对B的贡献,最后要减去A的部分#include<stdio.h>#define maxn 1000 + 10int main() {  int n, a[maxn], b[maxn];  int kase = 0;  while(scanf("%d", &n) == 1 && n) { // n=0时输入结束    printf("Game %d:\n", ++kase);    for(int i = 0; i < n; i++) scanf("%d", &a[i]);    for(;;) {      int A = 0, B = 0;      for(int i = 0; i < n; i++) {        scanf("%d", &b[i]);        if(a[i] == b[i]) A++;      }      if(b[0] == 0) break; // 正常的猜测序列不会有0,所以只判断第一个数是否为0即可      for(int d = 1; d <= 9; d++) {        int c1 = 0, c2 = 0; // 统计数字d在答案序列和猜测序列中各出现多少次        for(int i = 0; i < n; i++) {          if(a[i] == d) c1++;          if(b[i] == d) c2++;        }        if(c1 < c2) B += c1; else B += c2;      }      printf("    (%d,%d)\n", A, B-A);    }  }  return 0;}*/

1 0