Hỏi thuật toán trò chơi đoán số

hient543

New Member
9/10/12
25
0
1
30
Em có bài toán này, nghĩ mãi không ra thuật toán, anh chị vào đóng ghóp ý kiến:

Cậu bé nghĩ ra 1 số (Gọi là S) gồm bỗn chữ số (không nhất thiết khác nhau) trong sáu chữ số từu 1 đến 6. Để tìm số đó máy lần lượt đưa ra các số dự đoán (gọi là M), mỗi số gồm 4 chữ số không nhất thiết khác nhau. Với mỗi lần dự đoán, máy nhận được 2 câu trả lời của cậ bé cho 2 câu hỏi sau.
+ Có bao nhiêu chữ số trong M là chữ số trong S nhưng vị trí xuất hiện của mỗi chữ số đó là sai?
+ Có bao nhiêu chữ số trong M là chữ số trong S và đồng thời vị trí xuất hiện của mỗi chữ số đều đúng?
Yêu cầu: Hãy hiện lên màn hình các số máy dự đoán và nói mỗi số đó nhận 2 câu trả lời từ bàn phím của cậu bé cho đến khi được số đúng như cậu bé nghĩ. (Số lần dự đoán không quá 6 lần).
Ví dụ: Số cần tìm là 5436
1234
Đúng số - Đúng vị trí : 1
Đúng số - Sai vị trí : 1
2156
Đúng số - Đúng vị trí : 1
Đúng số - Sai vị trí : 1
1416
Đúng số - Đúng vị trí : 2
Đúng số - Sai vị trí : 0
5436
Đúng số - Đúng vị trí : 4
Đúng số - Sai vị trí : 0
Chọn đúng số
 

kimcy1992

Active Member
3/11/12
119
32
28
29
Hì bài này ko quá khó chủ yếu là trí tưởng tượng nhưng mà bạn cho ví dụ nó cứ ngang lắm, còn nếu viết thế thì hơi khó cho người chơi mình giống như trò đoán sản phẩm trong hãy chọn giá đúng quá :D. Thuật thì chả có gì hơn ngoài cái đề bài đã đưa đâu bạn nhập 6 lần mà thôi không được nhập quá ta đã có 1 vòng lặp xác định số lần rồi, số mà đoán so với số gốc sai chỗ nào thì hiển số sai và vị trí ra, đúng thì ta cũng hiển thì chỗ đúng và vị trí của nó, ở đây mình có liệt ra chỗ số nhập sai và nhập đúng cho người chơi dẽ nhận thấy và dễ chơi hơn, không thì bạn chỉ công bố nhập sai hoặc đúng thôi cũng được. Còn hàm đoán số chỉ là xử lý giá trị trả về là số được nhập vào ok hay không. Ngoài ra nếu viết lại bạn có thể tách thành 2 hàm nhập và kiểm tra như vậy sẽ tốt hơn cho việc sử dụng lại mã nguồn về sau, giờ ít thời gian quá viết ăn sổi vậy :D
Code cùi nhưng bạn có thể tham khảo
PHP:
public class DoanSo {

    final public String numberS = "5346";
    public String numberM = "";

    public DoanSo() {
    }

    /* xử lý đoán số */
    public boolean doanSo() {
        Scanner input = new Scanner(System.in);
        int ileng = this.numberS.length();
        for (int i = 1; i <= 6; i++) {
            do {
                System.out.print("Nhập vào số cần đoán có " + ileng + " chữ số:");
                this.numberM = input.nextLine();
                System.out.println("Bạn còn có " + (6 - i) + " lần đoán.");
                if (this.numberM.length() != this.numberS.length()) {
                    System.out.println("Nhập sai đô dài số đã cho mời nhập lại.");
                } else {
                    break;
                }
            } while (true);

            if (this.numberM.equals(this.numberS)) {
                return true;
            }

            for (int j = 0; j < ileng; j++) {
                if (this.numberM.charAt(j) == this.numberS.charAt(j)) {
                    System.out.println("Bạn đã nhập đúng số có giá trị " + this.numberS.charAt(j)
                            + " ở vị trí thứ " + j );
                } else {
                    System.out.println("Bạn đã nhập sai số có giá trị " + this.numberM.charAt(j)
                            + " ở vị trí thứ " + j );
                }
            }
        }
        return false;
    }

    public static void main(String[] args) {
        DoanSo doanso = new DoanSo();
        if (doanso.doanSo()) {
            System.out.println("Bạn đã trả lời đúng số cần đoán là:" + doanso.numberS);
        } else {
            System.out.println("Bạn đã trả lời sai số cần đoán là:" + doanso.numberS
                    + " và đã hết lượt đoán.");
        }
        System.gc();
    }
}
 

gaconlonton1989

New Member
27/10/11
27
3
3
mình nghĩ kimcy1992 hiểu sai đề bài thì phải. cái này là cậu bé cho số để máy đoán. chứ không phải máy cho cậu bé đoán, mỗi lần hiện ra cậu bé cho câu trả lời cho máy.
cái ví dụ hơi khoai thật đọc mãi mới hiểu. hê hê. nhưng mình nghĩ 2 câu trả lời của cậu bé sẽ không có nhiều ý nghĩa, vì mình nghĩ sẽ phải random các vị trí thôi . sau đó kiểm tra. bởi máy sẽ không nghĩ dc như người. máy sẽ không thể đoán vị trí nào đúng,vị trí nào sai, để đoán tiếp các lần tiếp theo. mà nó sẽ vẫn tìm theo như mình lập trình thôi.. hê hê
 
  • Like
Reactions: kimcy1992

kimcy1992

Active Member
3/11/12
119
32
28
29
mình nghĩ kimcy1992 hiểu sai đề bài thì phải. cái này là cậu bé cho số để máy đoán. chứ không phải máy cho cậu bé đoán, mỗi lần hiện ra cậu bé cho câu trả lời cho máy.
cái ví dụ hơi khoai thật đọc mãi mới hiểu. hê hê. nhưng mình nghĩ 2 câu trả lời của cậu bé sẽ không có nhiều ý nghĩa, vì mình nghĩ sẽ phải random các vị trí thôi . sau đó kiểm tra. bởi máy sẽ không nghĩ dc như người. máy sẽ không thể đoán vị trí nào đúng,vị trí nào sai, để đoán tiếp các lần tiếp theo. mà nó sẽ vẫn tìm theo như mình lập trình thôi.. hê hê
Nói thiệt là mình cũng đang học java thôi bạn còn việc dùng số ramdom mình chưa động tới, nếu nói vậy thì thuật toán của mình cũng chỉ cần thay vì nhập từ người dùng mà thay vào đó là ram dom số được nhập, như thế auto hơn. Còn theo mình thì cái giải thuật đó cũng không sai. Nhưng nếu dùng ram dom thì mình lại phải convert từ kiểu nguyên int sang String đúng không?
 

gaconlonton1989

New Member
27/10/11
27
3
3
hì ở đây mình không nói tới hàm random mình nói là chọn ngẫu nhiên các số ở mỗi vị trí, mình cũng là gà con mà đang học java mà gà quá. theo mình nghĩ thì mỗi vị trí máy sẽ chọn ngẫu nhiên, từ 1 tới 6, sau đó so sánh thôi, chứ còn cái ý chính mà bạn ý muốn, là máy nó tự đoán dựa theo cái em bé gợi ý. ấy thì khó quá mình chưa biết làm . nếu có thì chắc phải dùng automat, nhưng mà cái khỉ gió này chuối lắm nên em chượt mấy lần .... hì
 

kimcy1992

Active Member
3/11/12
119
32
28
29
hì ở đây mình không nói tới hàm random mình nói là chọn ngẫu nhiên các số ở mỗi vị trí, mình cũng là gà con mà đang học java mà gà quá. theo mình nghĩ thì mỗi vị trí máy sẽ chọn ngẫu nhiên, từ 1 tới 6, sau đó so sánh thôi, chứ còn cái ý chính mà bạn ý muốn, là máy nó tự đoán dựa theo cái em bé gợi ý. ấy thì khó quá mình chưa biết làm . nếu có thì chắc phải dùng automat, nhưng mà cái khỉ gió này chuối lắm nên em chượt mấy lần .... hì
hì mình hiểu ý bạn roài, vậy thì ram dom sẽ không được roài, vậy thì đúng số nào thì cần phải lưu vị trí đúng lại nhưng vấn đề ở đây lại không phải là do người nhập nếu người nhập thì có thể biết được ví trí đúng sai nhờ vào các thông báo đằng trước nó rồi. Chả nhẽ lại đi ramdom từng số cho từ vị trí để so sánh sao, chỗ nào đúng rồi thì ko ramdom số chỗ đó đấy nữa, nếu vậy lại cần thêm một bảng check đánh dấu vị trí số chọn đúng và chọn sai, giả sử check full true thì là ok ngược lại ko đúng và hết lần nhập :D
 

Joe

Thành viên VIP
21/1/13
3,022
1,335
113
Em có bài toán này, nghĩ mãi không ra thuật toán, anh chị vào đóng ghóp ý kiến:
Cậu bé nghĩ ra 1 số (Gọi là S) gồm bỗn chữ số (không nhất thiết khác nhau) trong sáu chữ số từu 1 đến 6. Để tìm số đó máy lần lượt đưa ra các số dự đoán (gọi là M), mỗi số gồm 4 chữ số không nhất thiết khác nhau. Với mỗi lần dự đoán, máy nhận được 2 câu trả lời của cậ bé cho 2 câu hỏi sau.
+ Có bao nhiêu chữ số trong M là chữ số trong S nhưng vị trí xuất hiện của mỗi chữ số đó là sai?
+ Có bao nhiêu chữ số trong M là chữ số trong S và đồng thời vị trí xuất hiện của mỗi chữ số đều đúng?
Yêu cầu: Hãy hiện lên màn hình các số máy dự đoán và nói mỗi số đó nhận 2 câu trả lời từ bàn phím của cậu bé cho đến khi được số đúng như cậu bé nghĩ. (Số lần dự đoán không quá 6 lần).
Ví dụ: Số cần tìm là 5436
1234
Đúng số - Đúng vị trí : 1
Đúng số - Sai vị trí : 1
2156
Đúng số - Đúng vị trí : 1
Đúng số - Sai vị trí : 1
1416
Đúng số - Đúng vị trí : 2
Đúng số - Sai vị trí : 0
5436
Đúng số - Đúng vị trí : 4
Đúng số - Sai vị trí : 0
Chọn đúng số
What does a thinker when he or she encounters this problem ? He or she firstly lists all the possibilities
PHP:
Ví dụ: Số cần tìm là 5436
1234
Đúng số - Đúng vị trí : 1
Đúng số - Sai vị trí : 1
2156
Đúng số - Đúng vị trí : 1
Đúng số - Sai vị trí : 1
1416
Đúng số - Đúng vị trí : 2
Đúng số - Sai vị trí : 0
5436
Đúng số - Đúng vị trí : 4
Đúng số - Sai vị trí : 0
Chọn đúng số
then tries to recognize the patterns before he or she formulates the rules and begins to develop an algorithm to solve this problem.
 

gaconlonton1989

New Member
27/10/11
27
3
3
hì mình hiểu ý bạn roài, vậy thì ram dom sẽ không được roài, vậy thì đúng số nào thì cần phải lưu vị trí đúng lại nhưng vấn đề ở đây lại không phải là do người nhập nếu người nhập thì có thể biết được ví trí đúng sai nhờ vào các thông báo đằng trước nó rồi. Chả nhẽ lại đi ramdom từng số cho từ vị trí để so sánh sao, chỗ nào đúng rồi thì ko ramdom số chỗ đó đấy nữa, nếu vậy lại cần thêm một bảng check đánh dấu vị trí số chọn đúng và chọn sai, giả sử check full true thì là ok ngược lại ko đúng và hết lần nhập :D
khổ nhưng mà người ta có cho biết là vị trí nào đúng đâu mà lưu, hê hee. chỉ cho biết là mấy số đúng mà đúng vị trí, và mấy số đúng mà sai vị trí thôi mà... hu hu
 

kimcy1992

Active Member
3/11/12
119
32
28
29
khổ nhưng mà người ta có cho biết là vị trí nào đúng đâu mà lưu, hê hee. chỉ cho biết là mấy số đúng mà đúng vị trí, và mấy số đúng mà sai vị trí thôi mà... hu hu
Bạn xem lại ví dụ đi, đúng số ở vị trị còn gì, sao lại bảo không cho biết vị trí nào là đúng là sao.:-/
 

Nancru

CongDongJava Project Leader
Staff member
9/10/11
1,634
308
83
Bài này có thể làm theo kiểu cây, mỗi node lưu số dự đoán, giả sử đúng số đúng vị trí và đúng số sai vị trí ko tăng mà giảm, thì ta có thể back lại node trước đó. Đại khái là vậy.
 

gaconlonton1989

New Member
27/10/11
27
3
3
Bạn xem lại ví dụ đi, đúng số ở vị trị còn gì, sao lại bảo không cho biết vị trí nào là đúng là sao.:-/

1234
Đúng số
- Đúng vị trí : 1
Đúng số
- Sai vị trí : 1


cái này số 4 đúng nhưng vị trí của nó ở vị trí số 4 đúng không.

ở đây bạn ý chỉ cho biết có mấy số đúng, cả số lẫn vị trí chứ không có cho biết đúng ở vị trí nào...

thật ra cái VD thông báo của bạn ấy hơi có vấn đề

mình nghĩ nó phải thế này(chủ thớt thấy đúng không cho ý kiến nhé)
1234
Đúng sô - đúng vị trí : 0
Đúng số - sai vị trí : 1

vì trong số này có số 4 đúng số, nhưng sai vị trí...
 

kimcy1992

Active Member
3/11/12
119
32
28
29

1234
Đúng số - Đúng vị trí : 1
Đúng số - Sai vị trí : 1

cái này số 4 đúng nhưng vị trí của nó ở vị trí số 4 đúng không.

ở đây bạn ý chỉ cho biết có mấy số đúng, cả số lẫn vị trí chứ không có cho biết đúng ở vị trí nào...

thật ra cái VD thông báo của bạn ấy hơi có vấn đề

mình nghĩ nó phải thế này(chủ thớt thấy đúng không cho ý kiến nhé)
1234
Đúng sô - đúng vị trí : 0
Đúng số - sai vị trí : 1

vì trong số này có số 4 đúng số, nhưng sai vị trí...
Ừ nhưng tóm lại cái ví dụ của bạn ý giải thích củ chuối quá, mà làm như vậy thì thoai khỏi cần thông báo đúng sai làm gì cứ làm phát 6 lần ramdom cho nhanh, thông báo đúng 1 vị trí mà không cho biết vị trí nào thế thì tù mù quá, chả giúp gì người chơi cả. Số to hơn tí nữa mà cũng không cần to hơn thì cũng chết rồi. Hì lúc nãy mình nghĩ ví dụ đưa sai quên không cmt vào :D. xin lỗi bạn sự cố ngu ngốc này.
 

JackV

Administrator
Staff member
Em có bài toán này, nghĩ mãi không ra thuật toán, anh chị vào đóng ghóp ý kiến:

Cậu bé nghĩ ra 1 số (Gọi là S) gồm bỗn chữ số (không nhất thiết khác nhau) trong sáu chữ số từu 1 đến 6. Để tìm số đó máy lần lượt đưa ra các số dự đoán (gọi là M), mỗi số gồm 4 chữ số không nhất thiết khác nhau. Với mỗi lần dự đoán, máy nhận được 2 câu trả lời của cậ bé cho 2 câu hỏi sau.
+ Có bao nhiêu chữ số trong M là chữ số trong S nhưng vị trí xuất hiện của mỗi chữ số đó là sai?
+ Có bao nhiêu chữ số trong M là chữ số trong S và đồng thời vị trí xuất hiện của mỗi chữ số đều đúng?
Yêu cầu: Hãy hiện lên màn hình các số máy dự đoán và nói mỗi số đó nhận 2 câu trả lời từ bàn phím của cậu bé cho đến khi được số đúng như cậu bé nghĩ. (Số lần dự đoán không quá 6 lần).
Ví dụ: Số cần tìm là 5436
1234
Đúng số - Đúng vị trí : 1
Đúng số - Sai vị trí : 1
2156
Đúng số - Đúng vị trí : 1
Đúng số - Sai vị trí : 1
1416
Đúng số - Đúng vị trí : 2
Đúng số - Sai vị trí : 0
5436
Đúng số - Đúng vị trí : 4
Đúng số - Sai vị trí : 0
Chọn đúng số
Ghê, giờ lại đến người đố máy nữa.
Đọc ví dụ thấy thật khó hiểu.

Ví dụ: Số cần tìm là 5436
1234
Đúng số - Đúng vị trí : 1 > Tại sao lại đúng vị trí 1, vị trí 1 là số 1 mà trong số cần tìm không có
Đúng số - Sai vị trí : 1 > Tại sao lại sai vị trí 1 trong khi ở trên mới nói là đúng vị trí 1

2156
Đúng số - Đúng vị trí : 1 > Tại sao lại đúng vị trí 1, vị trí 1 là số 2 mà trong số cần tìm không có
Đúng số - Sai vị trí : 1 > Tại sao lại sai vị trí 1 trong khi ở trên mới nói là đúng vị trí 1
1416
Đúng số - Đúng vị trí : 2 > Ok, vị trí 2 là số 4, số 4 có trong số cần tìm

Đúng số - Sai vị trí : 0 > Đâu ra vị trí 0, bắt người chơi nhận diện index 0 hay sao.

5436
Đúng số - Đúng vị trí : 4 > Ok, vị trí 4 là số 6, số 6 có trong số cần tìm
Đúng số - Sai vị trí : 0 > Đâu ra vị trí 0, bắt người chơi nhận diện index 0 hay sao.

Không đơn giản chỉ là hại não >:)
 
  • Like
Reactions: SITUVN

SITUVN

Well-Known Member
25/2/12
964
263
63
Đấy đấy, hại não quá nên mình không dám trả lời.
Mình đọc mãi và nghiệm đi nghiệm lại, mình cũng chẳng biết là mình ko hiểu hay là cái bài tập cù lần nữa :|
 

khangphamngoc90

Algorithms Master
Staff member
2/4/11
379
145
43
Ghê, giờ lại đến người đố máy nữa.
Đọc ví dụ thấy thật khó hiểu.

Ví dụ: Số cần tìm là 5436
1234
Đúng số - Đúng vị trí : 1 > Tại sao lại đúng vị trí 1, vị trí 1 là số 1 mà trong số cần tìm không có
Đúng số - Sai vị trí : 1 > Tại sao lại sai vị trí 1 trong khi ở trên mới nói là đúng vị trí 1

2156
Đúng số - Đúng vị trí : 1 > Tại sao lại đúng vị trí 1, vị trí 1 là số 2 mà trong số cần tìm không có
Đúng số - Sai vị trí : 1 > Tại sao lại sai vị trí 1 trong khi ở trên mới nói là đúng vị trí 1
1416
Đúng số - Đúng vị trí : 2 > Ok, vị trí 2 là số 4, số 4 có trong số cần tìm

Đúng số - Sai vị trí : 0 > Đâu ra vị trí 0, bắt người chơi nhận diện index 0 hay sao.

5436
Đúng số - Đúng vị trí : 4 > Ok, vị trí 4 là số 6, số 6 có trong số cần tìm
Đúng số - Sai vị trí : 0 > Đâu ra vị trí 0, bắt người chơi nhận diện index 0 hay sao.

Không đơn giản chỉ là hại não >:)
Anh hiểu sai ý đồ của chủ 2pic!
Đúng vị trí : 4 số --> có 4 số hợp lệ = đếm số lượng

Sai vị trí : 0 số
 
  • Like
Reactions: JackV

trinhbui

New Member
19/10/21
2
0
1
hà nội
Em có bài toán này, nghĩ mãi không ra thuật toán, anh chị vào đóng ghóp ý kiến:
Viết chương trình mô phỏng bài toán qua sông (có thể có giao diện đồ họa). Bài toán phát biểu như sau:
Tại bến sông nọ có 3 thầy tu và 3 con quỷ muốn qua sông. Biết rằng tại một thời điểm thuyền chỉ chở tối đa được 2 khách. Nếu bất cứ ở trên bờ nào, bên này hoặc bên kia thì số con quỷ phải bé hơn hoặc bằng số thầy tu, ngược lại quỷ sẽ ăn thịt thầy tu.
Hãy viết chương trình giải quyết bài toán trên.