Thuật toán Tô màu Sudoku

M.n cho e xin ý tưởng về thuật toán tô màu CHo Sudoku với ạ
E đã tạo ra mảng 2 chiều nhưng chưa biết gán trị cho các ô thế nào do 81 ô có tên biến khác nhau ạ.M.n tư vấn giúp em

Bạn hỏi câu nhức nách ghê á.

Mảng là một kiểu cấu trúc dữ liệu, tập hợp các phần tử cùng kiểu dữ liệu và mỗi phần tử trong mảng có thể được truy xuất thông qua chỉ số của nó trong mảng.

2 Likes

Như này nè bác : e cài các ô trong sudoku là textfield nhưng mà mỗi cái textfield đó có 1 tên biến riêng ,cái e ko biết là làm như nào để các giá trị mảng cho các ô tf đó từ 1-81 ấy,có cách nào lấy giá trị của tên biến ko đó bác.

1 Like

bạn đang tạo các ô sudoku textfield bằng kéo thả à?

Như vậy không được ạ ??

để các giá trị mảng cho các ô tf đó từ 1-81

Ý bạn có phải là bạn tạo ra một mảng 2 chiều JTextField[][] và không biết cách để gán từng cái vào từng phần tử kiểu như JTextField[0][0],…

có cách nào lấy giá trị của tên biến ko đó bác.

Lấy giá trị của tên biến là thế nào? Ý bạn có phải là variableName.getText(); ?

3 Likes

E đặt tên các Jtext là a11 a12 a13,… .Nên muốn tìm cách nào để lấy các số 1 1 ,1 2 để gán giá trị khi e chạy 2 vòng lặp ấy bác

tạo bằng kéo thả thì không thể dynamically như bạn nói được. Phải tạo programatically, chẳng hạn bạn có mảng hai chiều:

JTextField[][] sudokuArray = new JTextField[9][9];
sudokuArray[i][j].setName('sudoku'+i+j);

ý tưởng là vậy

5 Likes

Như bạn @MossGreen đã nói bạn không nên làm thủ công từng cái như vậy chứ.
Dưới dây là ví dụ của mình để bạn tham khảo nếu cần.

Summary
import java.awt.GridLayout;
import java.util.Random;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JTextField;
import javax.swing.SwingUtilities;

public class Sudoku {
    public static void makeSudokuTable() {
        JPanel panel = new JPanel(new GridLayout(9, 0));
        JTextField[][] fields = new JTextField[9][9];
        
        Random generator = new Random();
        for(int i = 0 ; i < 9; i++) {
            for(int j = 0 ; j < 9; j++) {
                fields[i][j] = new JTextField();
                fields[i][j].setSize(10, 10);
                fields[i][j].setHorizontalAlignment(JTextField.CENTER);
                
                int value = generator.nextInt(9) + 1;
                fields[i][j].setText("" + value);        
                panel.add(fields[i][j]);
            }
        }
        
        JFrame frame = new JFrame("Sudoku");
        frame.add(panel);
        frame.setSize(400, 400);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setVisible(true);
    }
    
    public static void main(final String[] args) {
        SwingUtilities.invokeLater(Sudoku::makeSudokuTable);
    }
}

4 Likes

Vậy bài này chỉ code tay được thôi ạ ? E mới tập tành nên còn hơi hạn hẹp về kiến thức phần hàm
Đoạn trên E chưa hiểu chỗ psvm SwingUtlities.invokeLater là sao ạ

Bởi vì:

Swing object methods are not thread safe

Nghĩa là:

If those (non thread safe) methods are invoked from multiple threads this could result in thread interference or memory consistency errors.

Tại sao lại dùng SwingUtlities.invokeLater():
java - SwingUtilities.invokeLater() why is it needed? - Stack Overflow

Bạn có thể tham khảo thêm bằng google, mình hơi bị lười tí :slight_smile: .

5 Likes

Nếu vẫn kéo - thả thì thêm 82 dòng mã nữa để cho từng trường (biến) đơn vào mảng.

JTextField[][] tArray = new JTextField[9][9];
tArray[0][0] = tf1; // JTextField tại 0,0
...

Giờ thì thao tác trên mảng rồi đấy.:roll_eyes:
Cách của @Le_Trong1 thì nên dùng hơn.

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