promotion image of download ymail app
Promoted

請問如何用c++做猜數字的程式(幾A幾B)?

有人可以幫我PO程式碼上來嗎?

我是用Dev-C++的

謝謝^^

3 個解答

評分
  • Dave
    Lv 7
    1 0 年前
    最佳解答

    char validity[4000]; // 陣列,記錄答案是否為可能的答案

    char choices[4000][5]; // 陣列,記錄答案本身 (例:"1234", "5678")

    // 回傳 0 要是有超過 1 個以上的可能答案, 回傳 1 要是只有 0 個或 1 個答案

    int HasUniqueAnswer()

    {

    int answerFound = 0;

    for(int i=0; i<3024; i++) // 全部只有 3024 種組合

    {

    if( validity[i] )

    {

    if( answerFound )

    return 0;

    else

    answerFound = 1;

    }

    }

    return 1;

    }

    // 在可能的答案中,把第1個可能的答案回傳

    char* GetFirstValidAnswer()

    {

    for(int i=0; i<3024; i++)

    {

    if( validity[i] )

    return choices[i];

    }

    return 0;

    }

    // 檢查 src 跟 target 之間的 A, B 關係是否跟所要的是一樣的

    int IsMatch( char* src, char* target, int A, int B)

    {

    int a = 0;

    int b = 0;

    for( int i=0; i<4; i++)

    {

    for(int j=0; j<4; j++)

    {

    if( target[j] == src[i])

    {

    if( j == i ) a ++;

    else b++;

    }

    }

    }

    return ( A == a ) && ( B == b );

    }

    // 把可能的答案中,不符合 A/B 條件的刪除

    void EliminateNonMatch( char* target, int A, int B )

    {

    for(int i=0; i<3024; i++)

    {

    if( validity[i] && !IsMatch( target, choices[i], A, B ) )

    {

    validity[i] = 0;

    }

    }

    }

    int _tmain(int argc, _TCHAR* argv[])

    {

    // init answer

    for(int a = 1, cnt = 0; a<10; a++ )

    {

    for( int b=1; b<10; b++ )

    {

    for(int c= 1; c<10; c++ )

    {

    for( int d = 1; d<10; d++)

    {

    if( a == b || a == c || a == d || b == c || b == d || c == d )

    continue;

    sprintf(choices[cnt], "%d%d%d%d", a,b,c,d);

    validity[cnt++] = 1;

    }

    }

    }

    }

    while( !HasUniqueAnswer() )

    {

    char* trial = GetFirstValidAnswer();

    char hint[100];

    cout<< trial << "?" << std::endl;

    cin >> hint;

    EliminateNonMatch( trial, hint[0] - '0', hint[2] - '0' );

    }

    char* trial = GetFirstValidAnswer();

    if( trial == 0 )cout << "No answer" << std::endl;

    elsecout << "Answer is " << trial << std::endl;

    return 0;

    }

    ============

    這個程式剛好跟樓上的相反,是程式猜你選的號碼

    程式會先猜一串數字,你要輸入 "XAXB",一直重覆到答案出來為止…

    註:要是 4A 要打 4A0B,要是 2B 要打 0A2B…

    2006-08-02 09:26:27 補充:

    自已玩了玩,覺得電腦真強,5-6次一次猜得出來…

    參考資料: myself
    • Commenter avatar登入以對解答發表意見
  • Almond
    Lv 6
    1 0 年前

    GOOD!

    • Commenter avatar登入以對解答發表意見
  • 1 0 年前

    我沒用過Dev-C++

    我是用VC寫的...你看看...

    #include <stdio.h>

    #include <conio.h>

    #include <stdlib.h>

    #include <time.h>

    char Key_num[5],Set_num[5];

    int count;

    void main()

    {

    int A,B;

    A = B = 0;

    //亂數設4位數字

    srand(time(NULL)%37);

    for (int i=0;i<4;i++)

    {

    Set_num[i] = (int)rand()%10+48;

    //4位數字不可重覆

    for (int j=0;j<i;j++)

    if (Set_num[i] == Set_num[j])

    i--;

    }

    //printf("%s\n",Set_num);

    while (A != 4)

    {

    //輸入4位數字

    for (int x=0;x<4;x++)

    Key_num[x] = getche();

    //判斷猜中幾位(填入AB)

    for (int y=0;y<4;y++)

    for (int z=0;z<4;z++)

    if (Key_num[y] == Set_num[z])

    y==z?A++:B++;

    //判斷是否結束(猜中)

    if (A == 4)

    {

    printf("\t4A\nYou win!!\n");

    getch();

    break;

    }

    else

    {

    printf("\t%dA%dB\n",A,B);

    A = B = 0;

    }

    }

    }

    寫得不是很好..請見諒^^"

    參考資料: 自己
    • Commenter avatar登入以對解答發表意見
還有問題?馬上發問,尋求解答。