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

Viết C code tìm đường trong mê cung sử dụng đệ quy

Viết C code tìm đường trong mê cung sử dụng đệ quy.
2 Xem trả lời
Hỏi chi tiết
110
Tham khảo câu trả lời từ Trợ lý ảo Lazi
Dưới đây là đoạn code C để tìm đường trong mê cung sử dụng đệ quy:

```c
#include

#define N 5

int maze[N][N] = {
{1, 0, 1, 1, 1},
{1, 1, 1, 0, 1},
{0, 0, 1, 1, 1},
{0, 0, 0, 1, 0},
{0, 0, 0, 1, 1}
};

int sol[N][N] = {0};

int isSafe(int x, int y) {
if (x >= 0 && x < N && y >= 0 && y < N && maze[x][y] == 1) {
return 1;
}
return 0;
}

int solveMazeUtil(int x, int y) {
if (x == N - 1 && y == N - 1) {
sol[x][y] = 1;
return 1;
}

if (isSafe(x, y)) {
sol[x][y] = 1;

if (solveMazeUtil(x + 1, y) || solveMazeUtil(x, y + 1)) {
return 1;
}

sol[x][y] = 0;
return 0;
}

return 0;
}

void printSolution() {
for (int i = 0; i < N; i++) {
for (int j = 0; j < N; j++) {
printf("%d ", sol[i][j]);
}
printf("\n");
}
}

int main() {
if (solveMazeUtil(0, 0) == 0) {
printf("No solution found\n");
} else {
printSolution();
}

return 0;
}
```

Trong đoạn code trên, chúng ta sử dụng một mảng `maze` để lưu trữ mê cung, và một mảng `sol` để lưu trữ đường đi tìm được. Hàm `isSafe` kiểm tra xem một ô có thể đi qua hay không. Hàm `solveMazeUtil` sử dụng đệ quy để tìm đường trong mê cung. Cuối cùng, hàm `printSolution` được sử dụng để in ra đường đi tìm được.
2
0
QCường
23/03 11:24:22
+5đ tặng
#include <stdio.h>

#define N 5 // Kích thước của mê cung

// Kiểm tra xem ô (x, y) có hợp lệ không
int isValid(int maze[N][N], int x, int y) {
    // Kiểm tra xem (x, y) có nằm trong mê cung và không phải là tường
    if (x >= 0 && x < N && y >= 0 && y < N && maze[x][y] == 0)
        return 1;
    return 0;
}

// Hàm đệ quy để tìm đường trong mê cung
int findPath(int maze[N][N], int x, int y, int sol[N][N]) {
    // Điểm đích được đạt được
    if (x == N - 1 && y == N - 1) {
        sol[x][y] = 1;
        return 1;
    }

    // Kiểm tra xem ô (x, y) có hợp lệ không
    if (isValid(maze, x, y) == 1) {
        // Đánh dấu ô hiện tại là một phần của đường đi
        sol[x][y] = 1;

        // Di chuyển sang phải
        if (findPath(maze, x + 1, y, sol) == 1)
            return 1;

        // Di chuyển xuống
        if (findPath(maze, x, y + 1, sol) == 1)
            return 1;

        // Nếu không thể di chuyển sang phải hoặc xuống, đánh dấu ô này là không hợp lệ
        sol[x][y] = 0;
        return 0;
    }

    return 0;
}

// In ra ma trận đường đi trong mê cung
void printSolution(int sol[N][N]) {
    for (int i = 0; i < N; i++) {
        for (int j = 0; j < N; j++)
            printf(" %d ", sol[i][j]);
        printf("\n");
    }
}

// Hàm chính
int main() {
    int maze[N][N] = {
        {0, 1, 0, 1, 1},
        {0, 0, 0, 0, 1},
        {1, 0, 1, 0, 0},
        {0, 0, 1, 0, 1},
        {1, 0, 0, 0, 0}
    };

    // Khởi tạo ma trận lưu đường đi
    int sol[N][N] = {{0, 0, 0, 0, 0},
                     {0, 0, 0, 0, 0},
                     {0, 0, 0, 0, 0},
                     {0, 0, 0, 0, 0},
                     {0, 0, 0, 0, 0}};

    if (findPath(maze, 0, 0, sol) == 1)
        printSolution(sol);
    else
        printf("Không tìm thấy đường đi trong mê cung!");

    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
1
BIN
23/03 11:31:47
+4đ tặng
#include <stdio.h>

#define ROW 5
#define COL 5

// Kiểm tra xem ô (row, col) có thể di chuyển tới không
int isSafe(int maze[ROW][COL], int row, int col) {
    // Kiểm tra xem ô có nằm trong mê cung và có thể đi qua không
    return (row >= 0 && row < ROW && col >= 0 && col < COL && maze[row][col] == 0);
}

// Hàm giải mê cung bằng đệ quy
int solveMazeUtil(int maze[ROW][COL], int row, int col, int sol[ROW][COL]) {
    // Nếu đến được ô đích, trả về true
    if (row == ROW - 1 && col == COL - 1) {
        sol[row][col] = 1;
        return 1;
    }

    // Kiểm tra xem ô hiện tại có thể đi qua không
    if (isSafe(maze, row, col)) {
        // Đánh dấu ô này là một phần của lời giải
        sol[row][col] = 1;

        // Di chuyển sang phía bên phải
        if (solveMazeUtil(maze, row, col + 1, sol))
            return 1;

        // Nếu không thể đi sang phải, thử đi xuống
        if (solveMazeUtil(maze, row + 1, col, sol))
            return 1;

        // Nếu cả hai hướng trên đều không thể đi được, đánh dấu ô này là không phải là một phần của lời giải
        sol[row][col] = 0;
        return 0;
    }

    return 0;
}

// Hàm chính để giải mê cung
void solveMaze(int maze[ROW][COL]) {
    int sol[ROW][COL] = ;

    if (solveMazeUtil(maze, 0, 0, sol) == 0) {
        printf("Không có lời giải");
        return;
    }

    // In ra lời giải
    for (int i = 0; i < ROW; i++) {
        for (int j = 0; j < COL; j++)
            printf(" %d ", sol[i][j]);
        printf("\n");
    }
}

int main() {
    int maze[ROW][COL] = {
        {0, 1, 0, 0, 0},
        {0, 1, 0, 1, 0},
        {0, 0, 0, 0, 0},
        {1, 1, 1, 1, 0},
        {0, 0, 0, 1, 0}
    };

    solveMaze(maze);
    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
×