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

本文介绍了一种实现MasterMind游戏的算法,通过对比答案序列与猜测序列,统计位置正确的数字数量(A)及数字虽存在但位置错误的数量(B)。文章提供了两种实现方式:一种是直接比较法,另一种是统计数字出现次数的方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

//给定答案序列和用户猜的序列,统计有多少数字位置正确(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 + 10

int 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;
}
*/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值