查看完整版本: 1A2b的設計問題
頁: [1]

isorai001 發表於 2016-12-2 05:20 AM

1A2b的設計問題

請大家幫幫忙,學生要做科展,但想要將內容用電腦呈現,他們想要做7個數字的1A2B,但又多了兩個條件,也就是左邊正確就是C,右邊正確就是D,但第一個只能判斷右邊與第七個只能判斷左邊,請大家幫幫忙,要如何寫,謝謝大家<div></div>

kiwis 發表於 2016-12-2 09:44 AM

本帖最後由 kiwis 於 2016-12-2 09:52 AM 編輯

最簡單的就是跑兩個迴圈整串下去測吧。int max_length(7);

void check(char* answer, char* user_input)
{
        unsigned char A(0);
        unsigned char B(0);
        unsigned char C(0);
        unsigned char D(0);

        for(int i(0); i<max_length; ++i)
        {
                for(int j(0); j<max_length; ++j)
                {
                        if(user_input == answer)
                        {
                                if(i==j)
                                {
                                        A++;
                                        break;
                                }
                                if(i!=j)
                                        B++;
                                if(i>j)
                                {
                                        C++;
                                        break;
                                }
                                if(i<j)
                                {
                                        D++;
                                        break;
                                }
                        }
                }
        }
        // 把 A B C D 印出來或看要做甚麼處理
}要注意的地方:
1. 電腦產生的答案假設已經做好了(隨機產生7個數字,不重複)
2. 玩家輸入已經處理完成(不重複的一串7個數字)
3. 輸入為字串模式
4. 沒做任何檢查,這個讓各位自己做 : p


    //呼叫方式:
    char* answer =     "0123456";
    char* user_input = "2049367";

    check(answer, user_input);


...<div class='locked'><em>瀏覽完整內容,請先 <a href='member.php?mod=register'>註冊</a> 或 <a href='javascript:;' onclick="lsSubmit()">登入會員</a></em></div>

kiwis 發表於 2016-12-2 06:20 PM

本帖最後由 kiwis 於 2016-12-2 06:35 PM 編輯

嗯~另外一套想法,執行效率會好一點,但是會使用額外的記憶體...


int char_set = {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1};

    char* answer =     "0123456";
    char* user_input = "2049367";

    unsigned char A(0);
    unsigned char B(0);
    unsigned char C(0);
    unsigned char D(0);

    // char_set 的 index = user_input 的值,char_set = user_input 的 index
    // -1 為該數字未被使用
    for(int x(0); x<7; x++)
    {
        check02++;
        char_set[ user_input-48 ] = x;  // ascii code - 48 = 數字
    }


    for(int i(0); i<7; ++i)
    {
        check02++;

        if( char_set[ answer-48 ] != -1)
        {
            if( char_set[ answer-48 ] == i )
                ++A;
            else
            {
                ++B;

                if(char_set[ answer-48 ] < i)
                    ++C;
                if(char_set[ answer-48 ] > i)
                    ++D;
            }
        }
    }


迴圈執行次數從最大 7*7 降到 固定 7*2,
但是多使用了一些記憶體(char_set): p


...<div class='locked'><em>瀏覽完整內容,請先 <a href='member.php?mod=register'>註冊</a> 或 <a href='javascript:;' onclick="lsSubmit()">登入會員</a></em></div>

scottcheng 發表於 2016-12-3 12:01 AM

本帖最後由 scottcheng 於 2016-12-3 12:06 AM 編輯

void check(char *answer, char *input)
{
    char *pch = input;
    char *found;
    int da, di;
    int A, B, C, D;

    A = B = C = D = 0;

    while (*pch != 0) {
        found = strchr(answer, *pch);
        if (found) {
          da = found - answer;
          di = pch  - input;

          if (da == di) {
             A++;
             pch++;
             continue;
          } else
             B++;

          if (da < di)
             C++;
          else
             D++;
        }
        pch++;
    }

    print_f("%dA%dB%dC%dD\n", A, B, C, D);
}隨便寫寫, 用樓上call法, 其實寫法應該也差不了多少, 你參考看看!...<div class='locked'><em>瀏覽完整內容,請先 <a href='member.php?mod=register'>註冊</a> 或 <a href='javascript:;' onclick="lsSubmit()">登入會員</a></em></div>

isorai001 發表於 2016-12-3 08:41 PM

非常感謝大大們的幫忙,我會試試看,謝謝你們了~
太感動了~<br><br><br><br><br><div></div>
頁: [1]