Hỏi về Backtracking điền số vào bảng 3 * 3

em chào tất cả mọi người , em là newbie đang học về python, e có thắc mắc về phần code của e , e tạo 1 ma trận 3*3 vs các số cho trc , sao cho tổng dọc ngang chéo mỗi cái là 15, vấn đề là e thử phần code
của e không chạy , nhưng cũng không báo lỗi ,e đoán là sai trong phần suy nghĩ, e đã ngồi thử nhưng không tìm ra được, mong các cao nhân chỉ giáo

class map(object):
    def __init__(self):
        self.liste=[[0,0,0],[0,0,0],[0,0,0]]
        self.con=True##conditions
        self.number=[1,2,3,4,5,6,7,8,9]
    def add(self,n,row,column):column
        self.liste[row][column]=n
    def remove(self,row,column):
        self.liste[row][column]=0
    def wert(self,row,column):
        return self.liste[row][column]
    def isvoll(self):
        for i in range(3):
            for j in range(3):
                if self.liste[i][j]==0:
                    return False
        return True
    def Result2(self):
        if self.isvoll()==True:##when matrix is full
            if self.istrue()==True:##whenn matrix í right
                print(self.__str__())
        else:
            for i in range(3):##detele all element in number, which is already in the matrix(xoa phan tu trong list number(so 1-9) tu , cai da co trong ma tran )
                for j in range(3):
                    if self.liste[i][j] in self.number:
                        self.number.remove(self.liste[i][j])
            for i in range(3):## backtracking and gives all situation
                for j in range(3):
                    for a in self.number:
                        if self.liste[i][j]==0:
                            self.add(a,i,j)
                            self.Result2()
                            self.add(0,i,j)
    def istrue(self):
        for i in range(len(self.liste)):
            if(self.liste[i][0]+self.liste[i][1]+self.liste[i][2]==15):##sum row=15(hang)
                self.con=True
            else:
                return False
            if(self.liste[0][i]+self.liste[1][i]+self.liste[2][i]==15):##sum column=15(cot)
                self.con=True
            else:
                return False
        if(self.liste[0][0]+self.liste[1][1]+self.liste[2][2]==15):##sum von position(00,11,22)(cheo)
            self.con=True
        else:
            return False 
        if(self.liste[0][2]+self.liste[1][1]+self.liste[2][0]==15):##sum von position(20,11,02)(cheo)
            self.con=True
        else:
            return False 
        return self.con
    def __str__(self):
        result=""
        for i in range(len(self.liste)):
            result+="\n"
            for j in range(len(self.liste)):
                result+=str(self.liste[i][j])+" "
        return result
x=map()
x.add(4,0,0)
x.add(5,1,1)
x.add(6,2,2)
x.Result2()

Welcome to DNH!
Trước hết, cậu có thể đăng lại đoạn code trên với phiên bản sử dụng tiếng Anh được không? Tớ nghĩ sẽ có ích hơn cho mọi người.

5 Likes

vâng , bạn đợi mình xíu để mình chỉnh lại

1 Like

mình sửa r ạ , cảm ơn bạn đã góp ý

1 Like

Tớ làm 1 bảng từ vựng nho nhỏ cho bạn nào muốn giúp bạn cánh gà, cho những từ bạn ấy chưa có thời gian dịch :wink: :

German English Vietnamese
wert value giá trị
liste list danh sách
sum von position sum of position tổng của các vị trí
is voll is full đầy
7 Likes

Tớ đoán là code của cậu bị lặp vô hạn thôi :smile:

Cậu đoán đúng rồi! :wink:

Tớ không rành về Python lắm, cũng chưa chạy code của cậu, nên tớ sẽ hỏi cậu vài câu và cậu tự trả lời nhé! :wink:

  1. Ở hàm istrue, thay vì duyệt
for i in range(3):

như mọi chỗ khác, cậu lại dùng:

for i in range(len(self.liste)):

liste lại là mảng 2 chiều. Vậy cậu đoán xem len(self.liste) sẽ trả về 3 không?
Tớ không rành python lắm, nên hỏi vậy :wink:

  1. Cậu đã thử in thêm thông tin trong hàm Result2 ra console chưa? Đôi khi nó sẽ có ích giúp cậu tìm được chuyện gì đã xảy ra.
    Debug cũng mang lại hiệu quả tương tự.

Thử trả lời nhé cánh gà! :wink:

5 Likes

bởi mình tạo ra liste vs 3 liste con nên len(self.liste) sẽ trả về 3 , hay mình chưa hiểu câu hỏi của bạn nhỉ ?

oh, tớ nghĩ cậu hiểu câu hỏi đầu tiên của tớ rồi.
Vậy câu hỏi thứ 2 thì sao cậu?

3 Likes

mình đoán là ko phải lỗi lặp vô hạn vì mình có thêm 1 thử 1 dòng print(x) ở cuối và nó tạo ra ma trận như bthg ko có thay đổi

mình đang phân vân là vì mình xóa các phần tử trong number đi ở đoạn backtracking mình quay lại nhưng chưa add số a vào vô number , mình đang cố ở đoạn đó :)))

đúng rồi đó cậu. Cậu xóa phần tử ở mảng number, nhưng lại không khôi phục lại nó khi backtrack.
Cậu có thể tự chứng minh giả thiết đó bằng cách in mảng number sau khi xóa hết :smile:

3 Likes

cảm ơn bạn mình sẽ thử tiếp ạ :))

1 Like

Nice effort!
Về cơ bản, cách tìm hiểu vấn đề của cậu là:

  1. Đặt ra giả thiết
  2. Tìm thông tin để chứng minh giả thiết đó. Nếu nó sai, loại nó đi và đặt giả thiết mới.

Giờ cậu bỏ được khả năng lặp vô hạn rồi, cậu có thể thu gọn đáng kể phạm vi gây lỗi.
Tiếp tục đi cậu!

6 Likes

nếu mảng 3x3 và tổng các đường ngang, dọc, chéo = 15 thì

  • giữa mảng phải là số 5
  • các phần tử đối xứng với số 5 có tổng = 10: (1, 5, 9), (2, 5, 8) …

nhiêu đây idea chắc bạn làm được ;V

5 Likes

Bảng đáp án nè:

Tổng quát:

-a+10 -b + 10 a+b-5
2a+b-10 5 -2a-b+20
-a-b+15 b a

Các số từ 1 đến 9:

6 7 2
1 5 9
8 3 4
7 Likes
83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?