Bài tập  /  Bài đang cần trả lời

Hãy giải game sudoku bằng phương pháp lập trình C++

Hãy giải game sudoku bằng phương pháp lập trình C++
3 Xem trả lời
Hỏi chi tiết
218
Tham khảo câu trả lời từ Trợ lý ảo Lazi
Dưới đây là một ví dụ về cách giải game Sudoku bằng phương pháp lập trình C++:

```cpp
#include
using namespace std;

const int N = 9;

bool isSafe(int board[N][N], int row, int col, int num) {
for (int i = 0; i < N; i++) {
if (board[row][i] == num || board[i][col] == num) {
return false;
}
}

int startRow = row - row % 3;
int startCol = col - col % 3;

for (int i = 0; i < 3; i++) {
for (int j = 0; j < 3; j++) {
if (board[i + startRow][j + startCol] == num) {
return false;
}
}
}

return true;
}

bool solveSudoku(int board[N][N]) {
int row, col;

if (!findEmptyLocation(board, row, col)) {
return true;
}

for (int num = 1; num <= 9; num++) {
if (isSafe(board, row, col, num)) {
board[row][col] = num;

if (solveSudoku(board)) {
return true;
}

board[row][col] = 0;
}
}

return false;
}

bool findEmptyLocation(int board[N][N], int &row, int &col) {
for (row = 0; row < N; row++) {
for (col = 0; col < N; col++) {
if (board[row][col] == 0) {
return true;
}
}
}

return false;
}

void printBoard(int board[N][N]) {
for (int i = 0; i < N; i++) {
for (int j = 0; j < N; j++) {
cout << board[i][j] << " ";
}
cout << endl;
}
}

int main() {
int board[N][N] = {
{5, 3, 0, 0, 7, 0, 0, 0, 0},
{6, 0, 0, 1, 9, 5, 0, 0, 0},
{0, 9, 8, 0, 0, 0, 0, 6, 0},
{8, 0, 0, 0, 6, 0, 0, 0, 3},
{4, 0, 0, 8, 0, 3, 0, 0, 1},
{7, 0, 0, 0, 2, 0, 0, 0, 6},
{0, 6, 0, 0, 0, 0, 2, 8, 0},
{0, 0, 0, 4, 1, 9, 0, 0, 5},
{0, 0, 0, 0, 8, 0, 0, 7, 9}
};

if (solveSudoku(board)) {
printBoard(board);
} else {
cout << "No solution exists" << endl;
}

return 0;
}
```

Trong ví dụ trên, chúng ta sử dụng phương pháp backtracking để giải game Sudoku. Hàm `isSafe` được sử dụng để kiểm tra xem một số có thể được đặt vào một ô cụ thể hay không. Hàm `solveSudoku` sử dụng đệ quy để thử tất cả các số từ 1 đến 9 cho mỗi ô trống trên bảng Sudoku cho đến khi tìm ra một giải pháp hoặc không có giải pháp nào tồn tại. Hàm `findEmptyLocation` được sử dụng để tìm vị trí của ô trống trên bảng Sudoku. Cuối cùng, hàm `printBoard` được sử dụng để in ra bảng Sudoku đã được giải.
1
0
Khang Gia
15/05 17:53:29
+5đ tặng
#include <iostream>
#define UNASSIGNED 0
#define N 9

bool FindUnassignedLocation(int grid[N][N], int &row, int &col);
bool isSafe(int grid[N][N], int row, int col, int num);

/* Hàm giải Sudoku */
bool SolveSudoku(int grid[N][N]) {
    int row, col;

    // Nếu không còn vị trí nào chưa được gán, chúng ta đã giải xong
    if (!FindUnassignedLocation(grid, row, col))
       return true;

    // thử nghiệm các số từ 1 đến 9
    for (int num = 1; num <= 9; num++) {
        // nếu nhìn thấy một số hợp lệ, gán nó và tiếp tục
        if (isSafe(grid, row, col, num)) {
            grid[row][col] = num;

            // trả về true nếu tiếp tục và thành công
            if (SolveSudoku(grid))
                return true;

            // nếu không thành công, hủy gán và thử lại
            grid[row][col] = UNASSIGNED;
        }
    }
    // nếu các số từ 1 đến 9 đều không hợp lệ, trả về false
    return false;
}

/* Tìm kiếm vị trí chưa được gán trên bảng Sudoku */
bool FindUnassignedLocation(int grid[N][N], int &row, int &col) {
    for (row = 0; row < N; row++)
        for (col = 0; col < N; col++)
            if (grid[row][col] == UNASSIGNED)
                return true;
    return false;
}

/* Kiểm tra xem có thể gán num vào vị trí (row, col) không */
bool isSafe(int grid[N][N], int row, int col, int num) {
    // Kiểm tra hàng và cột
    for (int d = 0; d < N; d++)
        if (grid[row][d] == num || grid[d][col] == num)
            return false;

    // Kiểm tra hộp 3x3
    int startRow = row - row % 3, startCol = col - col % 3;
    for (int i = 0; i < 3; i++)
        for (int j = 0; j < 3; j++)
            if (grid[i + startRow][j + startCol] == num)
                return false;

    return true;
}

/* In bảng Sudoku */
void printGrid(int grid[N][N]) {
    for (int row = 0; row < N; row++) {
       for (int col = 0; col < N; col++)
             std::cout << grid[row][col] << " ";
        std::cout << std::endl;
    }
}

int main() {
    int grid[N][N] = {{5, 3, 0, 0, 7, 0, 0, 0, 0},
                      {6, 0, 0, 1, 9, 5, 0, 0, 0},
                      {0, 9, 8, 0, 0, 0, 0, 6, 0},
                      {8, 0, 0, 0, 6, 0, 0, 0, 3},
                      {4, 0, 0, 8, 0, 3, 0, 0, 1},
                      {7, 0, 0, 0, 2, 0, 0, 0, 6},
                      {0, 6, 0, 0, 0, 0, 2, 8, 0},
                      {0, 0, 0, 4, 1, 9, 0, 0, 5},
                      {0, 0, 0, 0, 8, 0, 0, 7, 9}};
    if (SolveSudoku(grid) == true)
        printGrid(grid);
    else
        std::cout << "Không có giải pháp nào tồn tại";
    return 0;
}
 

Mở khóa để xem toàn bộ nội dung trả lời

(?)
Bạn đã đạt đến giới hạn của mình. Bằng cách Đăng ký tài khoản, bạn có thể xem toàn bộ nội dung trả lời
Cải thiện điểm số của bạn bằng cách đăng ký tài khoản Lazi.
Xem toàn bộ các câu trả lời, chat trực tiếp 1:1 với đội ngũ Gia sư Lazi bằng cách Đăng nhập tài khoản ngay bây giờ
Tôi đã có tài khoản? Đăng nhập
0
0
Dưn
05/06 09:25:52
#include <iostream>
using namespace std;

// Kích thước của ma trận Sudoku
#define N 9

// Hàm in ra ma trận Sudoku
void inSudoku(int sudoku[N][N]) {
    for (int i = 0; i < N; i++) {
        for (int j = 0; j < N; j++) {
            cout << sudoku[i][j] << " ";
        }
        cout << endl;
    }
}

// Hàm kiểm tra xem có thể gán giá trị num cho ô (row, col) không
bool kiemTra(int sudoku[N][N], int row, int col, int num) {
    // Kiểm tra hàng và cột
    for (int x = 0; x < N; x++) {
        if (sudoku[row][x] == num || sudoku[x][col] == num) {
            return false;
        }
    }
    
    // Kiểm tra trong ô 3x3
    int startRow = row - row % 3;
    int startCol = col - col % 3;
    
    for (int i = 0; i < 3; i++) {
        for (int j = 0; j < 3; j++) {
            if (sudoku[i + startRow][j + startCol] == num) {
                return false;
            }
        }
    }
    
    return true;
}

// Hàm giải Sudoku
bool giaiSudoku(int sudoku[N][N]) {
    int row, col;
    
    // Kiểm tra xem có ô trống không
    bool found = false;
    for (row = 0; row < N; row++) {
        for (col = 0; col < N; col++) {
            if (sudoku[row][col] == 0) {
                found = true;
                break;
            }
        }
        if (found) {
            break;
        }
    }
    
    // Nếu không có ô trống, Sudoku đã được giải
    if (!found) {
        return true;
    }
    
    // Gán giá trị cho ô trống từ 1 đến 9
    for (int num = 1; num <= 9; num++) {
        if (kiemTra(sudoku, row, col, num)) {
            sudoku[row][col] = num;
            if (giaiSudoku(sudoku)) {
                return true;
            }
            sudoku[row][col] = 0; // Quay lui nếu không tìm được giải pháp
        }
    }
    
    return false; // Trả về false nếu không tìm được giải pháp
}

int main() {
    // Ma trận Sudoku (0 là ô trống)
    int sudoku[N][N] = {
        {5, 3, 0, 0, 7, 0, 0, 0, 0},
        {6, 0, 0, 1, 9, 5, 0, 0, 0},
        {0, 9, 8, 0, 0, 0, 0, 6, 0},
        {8, 0, 0, 0, 6, 0, 0, 0, 3},
        {4, 0, 0, 8, 0, 3, 0, 0, 1},
        {7, 0, 0, 0, 2, 0, 0, 0, 6},
        {0, 6, 0, 0, 0, 0, 2, 8, 0},
        {0, 0, 0, 4, 1, 9, 0, 0, 5},
        {0, 0, 0, 0, 8, 0, 0, 7, 9}
    };

    cout << "Sudoku ban dau:" << endl;
    inSudoku(sudoku);

    if (giaiSudoku(sudoku)) {
        cout << "Sudoku da duoc giai:" << endl;
        inSudoku(sudoku);
    } else {
        cout << "Khong co giai phap cho Sudoku nay." << endl;
    }

    return 0;
}
 
0
0
Võ Tuấn Tài
21/06 09:04:54
#include <iostream>
using namespace std;

#define N 9

bool isSafe(int board[N][N], int row, int col, int num) {
    for (int x = 0; x < N; x++)
        if (board[row][x] == num || board[x][col] == num)
            return false;

    int startRow = row - row % 3, startCol = col - col % 3;
    for (int i = 0; i < 3; i++)
        for (int j = 0; j < 3; j++)
            if (board[i + startRow][j + startCol] == num)
                return false;

    return true;
}

bool solveSudoku(int board[N][N]) {
    int row, col;

    if (!findEmptyLocation(board, row, col))
        return true;

    for (int num = 1; num <= 9; num++) {
        if (isSafe(board, row, col, num)) {
            board[row][col] = num;
            if (solveSudoku(board))
                return true;
            board[row][col] = 0;
        }
    }

    return false;
}

void printBoard(int board[N][N]) {
    for (int i = 0; i < N; i++) {
        for (int j = 0; j < N; j++)
            cout << board[i][j] << " ";
        cout << endl;
    }
}

int main() {
    int board[N][N] = { {5, 3, 0, 0, 7, 0, 0, 0, 0},
                        {6, 0, 0, 1, 9, 5, 0, 0, 0},
                        {0, 9, 8, 0, 0, 0, 0, 6, 0},
                        {8, 0, 0, 0, 6, 0, 0, 0, 3},
                        {4, 0, 0, 8, 0, 3, 0, 0, 1},
                        {7, 0, 0, 0, 2, 0, 0, 0, 6},
                        {0, 6, 0, 0, 0, 0, 2, 8, 0},
                        {0, 0, 0, 4, 1, 9, 0, 0, 5},
                        {0, 0, 0, 0, 8, 0, 0, 7, 9} };

    if (solveSudoku(board))
        printBoard(board);
    else
        cout << "No solution exists" << endl;

    return 0;
}

Bạn hỏi - Lazi trả lời

Bạn muốn biết điều gì?

GỬI CÂU HỎI
Học tập không giới hạn cùng học sinh cả nước và AI, sôi động, tích cực, trải nghiệm

Hôm nay bạn thế nào? Hãy nhấp vào một lựa chọn, nếu may mắn bạn sẽ được tặng 50.000 xu từ Lazi

Vui Buồn Bình thường
×
Trợ lý ảo Trợ lý ảo
×
Đấu trường tri thức | Lazi Quiz Challenge +500k
Gửi câu hỏi
×