2016-02-14 53 views
0

現在我正在編程一個需要線索到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 

和我無法弄清楚如何設置這不僅僅是一個線索......任何幫助將是偉大的。

回答

1

主要閱讀循環似乎不正確:

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

你的意思是這個:

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

是的,但我想我刪除它,當我在後粘貼它,它是我的原始代碼。 – AaronFye

相關問題