我把这作为我的作业。编码时有点麻烦。我使用C作为语言。
问题:
Mastermind是两个玩家的游戏。在开始时,第一个玩家决定一个秘密密钥,它是一个序列(s1,s2,... sk),其中0< si< = n,然后第二个玩家进行轮次猜测,其中每个猜测的形式为(g1,g2,... gk),并且在每次猜测之后,第一个玩家计算猜测的分数。猜测的分数等于我们有gi = si的i的数量。
例如,如果密钥是(4,2,5,3,1)并且猜测是(1,2,3,7,1),那么得分是2,因为g2 = s2和g5 = S5。
给定一系列猜测和每个猜测的分数,您的程序必须确定是否存在至少一个生成这些精确分数的密钥。
输入:
第一行输入包含单个整数C(1 <= C <= 100)。 C测试案例如下。每个测试用例的第一行包含三个整数n,k和q。 (1&lt; = n,k <= 11,1 <= q <= 8)。接下来的q行包含猜测。
每个猜测由k个整数gi,1,gi,2,...... gi,k由单个空格分隔,然后是猜测bi的得分(1 <= gi,j <= n对于所有1&lt; = i&lt; = q,1&lt; = j&lt; = k;并且0&lt; = bi&lt; = k)
输出:
对于每个测试用例,如果至少存在生成那些精确分数的密钥,则输出“是”(不带引号),否则输出“否”。
我写的代码是:
#include <stdio.h>
#include <string.h>
#include <stdarg.h>
#include <stdlib.h>
#include <stdbool.h>
typedef struct set_t{
int count;
void **values;
} *SetRef;
SetRef set_create(void *values, ...);
int set_count(SetRef this);
bool set_contains(SetRef this, void *value);
int rscore(SetRef set1, void *value, int score);
int main(int argc,char **argv )
{
int t = 0, n = 0 ,k = 0,q = 0, score = 0;
char ch;
int arr1[n];
int arr2[n];
printf("Please enter the number of test cases(between 1 to 100):");
scanf("%d",&t);
printf("\n");
for ( int i = 1; i<=t;i++)
{
printf("Please enter values of n,k, q:");
scanf("%i %i %i",&n, &k, &q);
printf("\n");
printf("Enter the values of secret key");
score = 0;
for ( int c = 0 ; c < n ; c++ )
{
scanf("%d",&arr1[c]);
}
printf("\n");
printf("Enter the values of guess");
for ( int c = 0 ; c < n ; c++ )
{
scanf("%d",&arr2[c]);
}
}
SetRef set1 = set_create(&arr1);
SetRef set2 = set_create(&arr2);
for ( int i = 0; i < set2->count; i++){
void *val = set2->values[i];
score = rscore(set1, val,score);
}
if ( score == set1->count)
printf("Yes");
else
printf("No");
printf("\n");
}
}
SetRef set_create(void *values, ...)
{
SetRef set = calloc(1, sizeof(struct set_t));
if (values)
{
int count = 1;
va_list args;
va_start(args, values);
while (va_arg(args, void *))
{
count++;
}
va_end(args);
set->count = count;
set->values = calloc(count, sizeof(void *));
set->values[0] = values;
va_start(args, values);
int i = 1;
void *val;
while ((val = va_arg(args, void *)))
{
set->values[i++] = val;
}
va_end(args);
}
return set;
}
int set_count(SetRef this)
{
return this->count;
}
bool set_contains(SetRef this, void *value)
{
for (int i = 0; i < this->count; i++)
{
if (value == this->values[i])
return true;
}
return false;
}
int rscore(SetRef set1, void *value, int score){
void *val = value;
if (set_contains(set1, val))
score ++;
return score;
}
我有这些错误:
solution.cc:60:1:错误:'}'令牌之前的预期声明
除此之外,我的逻辑是否正确?我犯过任何重大错误吗?
不确定如何解决这个问题。需要一些指导。
答案 0 :(得分:4)
您正在将C源代码编译为C ++。 C和C ++是不同的语言。
将您的文件重命名为solution.c
而不是solution.cc
,并确保使用C编译器进行编译(例如,gcc
而不是g++
)
编辑:实际上,源代码看起来既不是C也不是C ++。选择一个并坚持下去。它几乎是C,您需要将#include <cstdarg>
更改为#include <stdarg.h>
,然后您需要为#include <stdbool.h>
类型添加bool
。您还需要将YES
和NO
更改为true
和false
。
如果使用Microsoft的MSC编译器,bool
类型可能不可用,该编译器使用过时的C版本。
答案 1 :(得分:2)
在C ++中this
是一个关键字,用作指向类成员函数内当前对象的指针。
您必须使用该语言未保留的其他名称。
或者,如果这实际上是C代码,则不包括<cstdarg>
等C ++标头,并将文件从.cc
重命名为.c
。
选择您的语言!
答案 2 :(得分:1)
您不能在C ++中将this
用作变量名。这是一个语言关键字。如果要编译C程序,请不要使用C ++编译器。