Cần giúp về thuật toán trò chơi bốc sỏi

em đang có một bài tập như dưới đây ạ. em mới học c++ được vài tuần, còn hơi chưa quen với tư duy thuật toán. em xin phép gửi code của em, mong anh chị chỉ giúp em lỗi sai ạ. em cám ơn mọi người nhiều ạ.

    bool canWinNim (char * path) {
        ifstream file(path);
        int n,d;
        file >> n;
        int tam;
        tam=n; d=0;
        if (tam <=3) {
            return true;}
        else {
        while (tam > 3) {
               tam = tam-3;
               ++d;
        }
        if ((d % 2)==0) {
            return true;
        } else {return false;}
    }
}

tư duy thuật toán với code nó không có liên quan nhau lắm
bạn đã đọc hiểu đề chưa? bạn đã có thể giải bằng tay bài này chưa? cho số đá ban đầu là 50 thì bạn có tìm ra được đáp án không?
nếu bạn có thể giải/tính được kết quả thì bạn có thể nói ra cách bạn tính hay không?

4 Likes

đề thì em đã đọc kĩ và hiểu được vấn đề bài toán hỏi ạ.
em mới chỉ nghĩ được đến 1 vấn đề

nếu mà trong các trường hợp, em bốc sao cho số đá còn lại sau khi bốc chia hết cho 4 thì sẽ luôn thắng ? phần này em k chăc đúng lắm ạ

phần giải tay thì do chưa nghĩ được rõ thuật toán nên em cũng chưa thể tìm được ạ
mong anh giải đáp ạ, xin cám ơn anh nhiều ạ

vậy, với số đá là 50 70 85 95 thì người đi trước thắng hay là thua (giả sử ai cũng biết cách chơi tối ưu)
bạn hãy trả lời kém với giải thích

3 Likes

về thuật toán thì bạn nên hiểu là khi đến lượt người A bốc mà còn đúng 4 viên thì người A chắc chắn thua cho nên bạn sẽ lấy số sỏi trừ lần lượt cho 4
khi mà số sỏi còn 4 viên thì người bốc tiếp theo thua , còn nếu còn dưới 3 viên thì người bốc tiếp theo sẽ thắng

#include <fstream>
int canWinNim (char * path) {
         ifstream file(path);
        int n,d;
        file >> n;
        int t;
        t=n; d=0;
        while(t>4){
            t=t-4;
        }
        if(t<=3){return true; }
        else if(t=4){return false;}
        

}
83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?