c - 程序仅在最后一个输入上循环

标签 c loops

现在我正在编写一个程序,它可以提供mastermind的线索。并返回需要猜测多少次才能得到正确的密码。然而,我有一个小问题,因为它只适用于输入的最后一个猜测,所以如果只输入一个猜测,它是正确的,但如果输入更多,它就不是......

这是我现在的代码:

#include <stdio.h>
#include <stdlib.h>

int bPegs(int *secret, int *sarr);
void frequency(int *array, int *freq);
int tPegs(int *freqA, int *freqG);
void perm(int list[],int k, int n);
int check(int ba, int bb, int wa, int wb);
int slots, colors, guesses;
int *guess;
int counter = 0;

int main() {
    int runs, k;
    scanf("%d", &runs);
    for (k = 0; k < runs; k++) {
        int i, j;
        scanf("%d", &slots);
        scanf("%d", &colors);
        scanf("%d", &guesses);
        guess = malloc(sizeof(int) * slots + 2);
        int *list = malloc(sizeof(int) * slots);
        for (i = 0; i < guesses; i++) {
            for (j = 0; j < slots + 2; j++) {
                scanf("%d", &guess[j]);
            }
        }
        perm(list, 0, slots);
        printf("%d", counter);
    }
    return 0;
}
int bPegs(int *secrets, int *sarr) {
    int i;
    int black = 0;
    for (i = 0; i < slots; i++) {
        if (secrets[i] == sarr[i]) {
            black++;
        }
    }
    return black;
}
void frequency(int *array, int *freq) {
    int i;
    for (i = 0; i < slots; i++) {
         freq[array[i]]++;
    }
}
int tPegs(int *freqA, int *freqG) {
    int i, total = 0;
    for (i = 0; i < colors; i++) {
        if (freqG[i] > freqA[i]) {
            total += freqA[i];
        }
        if (freqG[i] < freqA[i] && freqG[i] != 0) {
            total += freqG[i];
        }
        if (freqG[i] == freqA[i] && freqA[i] != 0) {
            total+=freqG[i];
        }
    }
    return total;
}
int check(int ba,int bb, int wa, int wb) {
    if (ba == bb && wa == wb) {
        return 1;
    } else {
        return 0;
    }
}
void perm(int list[], int k, int n) {
    int j;
    int *freqA = calloc(colors, sizeof(int));
    int *freqG = calloc(colors, sizeof(int));
    if (k == n) {
        frequency(list, freqA);
        frequency(guess, freqG);
        int ba = bPegs(list, guess);
        int ta = tPegs(freqA, freqG);
        int wa = ta - ba;
        int bb = guess[slots];
        int wb = guess[slots + 1];
        if (check(ba, bb, wa, wb)) {
            counter++;
        }
    } else {
        int i;
        for (i = 0; i < colors; i++) {
            list[k] = i;
            perm(list, k + 1, n);
        }
    }
}

这是一些示例输入/输出: 输入:

1
10 2 1
1 0 1 0 1 0 1 0 1 5 4

输出:

200

这是正确的,举个例子:

输入:

1
4 6 4
0 1 2 3 0 2
2 2 4 1 0 2
4 3 3 2 1 1
1 3 5 4 1 3

应该给出:

1

但它确实给出了:

8

我不知道如何将其设置为不仅仅是一个线索......任何帮助都会很棒。

最佳答案

主阅读循环似乎不正确:

        for (j = 0; j < slots + 2; j++) {
            ("%d", &guess[j]);
        }

您的意思是这样吗:

        for (j = 0; j < slots + 2; j++) {
            scanf("%d", &guess[j]);
        }

关于c - 程序仅在最后一个输入上循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35387239/

相关文章:

c - 为什么第一次输入后字符计数错误?

php - WordPress 循环 : how to wrap each 3 posts into a div?

c - 将 strcpy 应用于指向数组的指针 + some_offset

c - 解析 $PATH 变量并将目录名称保存到字符串数组中

c - 读取文件并在每行的开头添加 10 个数组元素读取到数组我正在存储文件的行

java - 如何将不重复的值从一个数组复制到另一个数组?

javascript - 停止无限 Javascript 循环

c++ - C++ 中的 for(;;) 循环是什么?

c - 格式参数太多

c++ - CMake-更改共享库链接选项