#include<stdio.h>
#include <stdlib.h>
#include <time.h>
//定义迷宫大小
#define ROW 10
#define COL 10
//定义节点状态
#define WALL 0
#define PATH 1
//初始化迷宫
int maze[ROW][COL] = { {0} };
//生成迷宫
int createMaze(int row, int col)
{
//设置起点和终点
maze[0][0] = PATH;
maze[row - 1][col - 1] = PATH;
//设置当前位置和方向
int x = 0, y = 0, dir = 0;
//定义四个方向上的偏移量
int dx[4] = { 0, 1, 0, -1 };
int dy[4] = { -1, 0, 1, 0 };
//随机生成路径
while (1)
{
//寻找当前节点的邻居节点
int neighbor[4] = { 0 };
int count = 0;
int i;
for (i = 0; i < 4; i++)
{
int nx = x + dx[i];
int ny = y + dy[i];
if (nx >= 0 && nx < row && ny >= 0 && ny < col && maze[nx][ny] == WALL)
{
neighbor[count++] = i;
}
}
//如果当前节点没有可访问的邻居节点,则回溯
if (count == 0)
{
int flag = 0;
for (i = 0; i < 4; i++)
{
int nx = x + dx[i];
int ny = y + dy[i];
if (nx >= 0 && nx < row && ny >= 0 && ny < col && maze[nx][ny] == PATH)
{
neighbor[count++] = i;
flag = 1;
}
}
if (flag == 0) break;
}
//随机选择一个邻居节点
int index = neighbor[rand() % count];
x += dx[index];
y += dy[index];
maze[x][y] = PATH;
}
return 0;
}
//打印迷宫
int printMaze(int row, int col)
{
int i, j;
for (i = 0; i < row; i++)
{
for (j = 0; j < col; j++)
{
if (maze[i][j] == WALL)
printf("■");
if (maze[i][j] == PATH)
printf(" ");
}
printf("\n");
}
return 0;
}
int main()
{
srand(time(NULL)); //初始化随机数生成器
createMaze(ROW, COL);
printMaze(ROW, COL);
return 0;
}
运行后只出现黑窗,无内容
引用chatgpt部分指引作答:
运行结果:
#include<stdio.h>
#include <stdlib.h>
#include <time.h>
//定义迷宫大小
#define ROW 10
#define COL 10
//定义节点状态
#define WALL 0
#define PATH 1
#define VISITED 2
//初始化迷宫
int maze[ROW][COL] = { {0} };
//生成迷宫
int createMaze(int row, int col)
{
//设置起点和终点
maze[0][0] = PATH;
maze[row - 1][col - 1] = PATH;
//设置当前位置和方向
int x = 0, y = 0, dir = 0;
//定义四个方向上的偏移量
int dx[4] = { 0, 1, 0, -1 };
int dy[4] = { -1, 0, 1, 0 };
//随机生成路径
while (1)
{
//将当前节点标记为已访问
maze[x][y] = VISITED;
//寻找当前节点的邻居节点
int neighbor[4] = { 0 };
int count = 0;
int i;
for (i = 0; i < 4; i++)
{
int nx = x + dx[i];
int ny = y + dy[i];
if (nx >= 0 && nx < row && ny >= 0 && ny < col && maze[nx][ny] == WALL)
{
neighbor[count++] = i;
}
}
//如果当前节点没有可访问的邻居节点,则回溯
if (count == 0)
{
int flag = 0;
for (i = 0; i < 4; i++)
{
int nx = x + dx[i];
int ny = y + dy[i];
if (nx >= 0 && nx < row && ny >= 0 && ny < col && maze[nx][ny] == PATH)
{
neighbor[count++] = i;
flag = 1;
}
}
if (flag == 0) break;
}
//随机选择一个邻居节点
int index = neighbor[rand() % count];
x += dx[index];
y += dy[index];
maze[x][y] = PATH;
}
return 0;
}
//打印迷宫
int printMaze(int row, int col)
{
int i, j;
for (i = 0; i < row; i++)
{
for (j = 0; j < col; j++)
{
if (maze[i][j] == WALL)
printf("■");
if (maze[i][j] == PATH)
printf(" ");
}
printf("\n");
}
return 0;
}
int main()
{
srand(time(NULL)); //初始化随机数生成器
createMaze(ROW, COL);
printMaze(ROW, COL);
return 0;
}
现在,代码应该可以成功生成并打印迷宫了。
测试看看
#include<stdio.h>
#include <stdlib.h>
#include <time.h>
#include <string.h>
//定义迷宫大小
#define ROW 10
#define COL 10
//定义节点状态
#define WALL 0
#define PATH 1
//初始化迷宫
int maze[ROW][COL] = { {0} };
//生成迷宫
int createMaze(int row, int col)
{
//设置起点和终点
maze[0][0] = PATH;
maze[row - 1][col - 1] = PATH;
//设置当前位置和方向
int x = 0, y = 0;
//定义四个方向上的偏移量
int dx[4] = { 0, 1, 0, -1 };
int dy[4] = { -1, 0, 1, 0 };
//记录已访问的节点
int visited[row][col];
memset(visited, 0, sizeof(visited));
//随机生成路径
while (1)
{
//寻找当前节点的邻居节点
int neighbor[4] = { 0 };
int count = 0;
int i;
for (i = 0; i < 4; i++)
{
int nx = x + dx[i];
int ny = y + dy[i];
if (nx >= 0 && nx < row && ny >= 0 && ny < col && maze[nx][ny] == WALL && !visited[nx][ny])
{
neighbor[count++] = i;
}
}
//如果当前节点没有可访问的未访问邻居节点,则回溯
if (count == 0)
{
int flag = 0;
for (i = 0; i < 4; i++)
{
int nx = x + dx[i];
int ny = y + dy[i];
if (nx >= 0 && nx < row && ny >= 0 && ny < col && maze[nx][ny] == PATH && !visited[nx][ny])
{
neighbor[count++] = i;
flag = 1;
}
}
if (flag == 0) break;
}
//随机选择一个邻居节点
int index = neighbor[rand() % count];
int nx = x + dx[index];
int ny = y + dy[index];
visited[nx][ny] = 1;
x = nx;
y = ny;
maze[x][y] = PATH;
}
return 0;
}
//打印迷宫
int printMaze(int row, int col)
{
int i, j;
for (i = 0; i < row; i++)
{
for (j = 0; j < col; j++)
{
if (maze[i][j] == WALL)
printf("■");
if (maze[i][j] == PATH)
printf(" ");
}
printf("\n");
}
return 0;
}
int main()
{
srand((unsigned int)time(NULL)); //初始化随机数生成器
createMaze(ROW, COL);
printMaze(ROW, COL);
return 0;
}
主要是没有正确回溯
//生成迷宫
int createMaze(int row, int col)
{
//设置起点和终点
maze[0][0] = PATH;
maze[row - 1][col - 1] = PATH;
//设置当前位置和方向
int x = 0, y = 0;
//定义四个方向上的偏移量
int dx[4] = { 0, 1, 0, -1 };
int dy[4] = { -1, 0, 1, 0 };
//记录已访问的节点
int visited[row][col];
memset(visited, 0, sizeof(visited));
//随机生成路径
while (1)
{
//寻找当前节点的邻居节点
int neighbor[4] = { 0 };
int count = 0;
int i;
for (i = 0; i < 4; i++)
{
int nx = x + dx[i];
int ny = y + dy[i];
if (nx >= 0 && nx < row && ny >= 0 && ny < col && maze[nx][ny] == WALL && !visited[nx][ny])
{
neighbor[count++] = i;
}
}
//如果当前节点没有可访问的未访问邻居节点,则回溯
if (count == 0)
{
int flag = 0;
for (i = 0; i < 4; i++)
{
int nx = x + dx[i];
int ny = y + dy[i];
if (nx >= 0 && nx < row && ny >= 0 && ny < col && maze[nx][ny] == PATH && !visited[nx][ny])
{
neighbor[count++] = i;
flag = 1;
}
}
if (flag == 0) break;
}
//随机选择一个邻居节点
int index = neighbor[rand() % count];
int nx = x + dx[index];
int ny = y + dy[index];
visited[nx][ny] = 1;
x = nx;
y = ny;
maze[x][y] = PATH;
}
return 0;
}
来自GPT的回答:
这个问题可能是由于迷宫的尺寸太小而导致的。在你的代码中,迷宫的尺寸被定义为10x10(ROW=10,COL=10),而每个迷宫单元格的宽度为2个字符(一个空格表示路径,一个字符表示墙壁)。
如果你的命令提示符窗口尺寸太小,无法容纳10x10的迷宫,你可能无法看到迷宫的完整输出。你可以尝试增大命令提示符窗口的尺寸,或者缩小迷宫的尺寸。
另外,你可以尝试在每行打印迷宫后,使用fflush(stdout)来刷新输出缓冲区,以确保迷宫立即显示在命令提示符窗口中。修改后的代码如下所示:
c
Copy code
//打印迷宫
int printMaze(int row, int col)
{
int i, j;
for (i = 0; i < row; i++)
{
for (j = 0; j < col; j++)
{
if (maze[i][j] == WALL)
printf("■");
if (maze[i][j] == PATH)
printf(" ");
}
printf("\n");
fflush(stdout); // 刷新输出缓冲区
}
return 0;
}
这样,每打印一行迷宫后,就会立即将其显示在命令提示符窗口中。
如果你还是无法看到完整的迷宫,请尝试调整窗口的尺寸或缩小迷宫的尺寸(例如,将迷宫的尺寸改为5x5),以便适应命令提示符窗口的大小。
因为现在一直处于 代码31行的这个while循环中
这段代码在生成迷宫时存在一个错误。在回溯时,当当前节点没有可访问的邻居节点时,代码会尝试在已经是路径的节点中选择一个邻居节点,这是不正确的。
在回溯时,应该回溯到上一个未访问的节点,而不是已经是路径的节点。修改代码中的回溯部分如下:
//如果当前节点没有可访问的邻居节点,则回溯
if (count == 0)
{
int flag = 0;
for (i = 0; i < 4; i++)
{
int nx = x + dx[i];
int ny = y + dy[i];
if (nx >= 0 && nx < row && ny >= 0 && ny < col && maze[nx][ny] == WALL)
{
neighbor[count++] = i;
flag = 1;
}
}
if (flag == 0) {
// 回溯到上一个未访问的节点
maze[x][y] = WALL;
x -= dx[dir];
y -= dy[dir];
continue;
}
}
通过这样的修改,回溯时将正确地回到上一个未访问的节点,并且生成的迷宫将是正确的。
你需要的10*10迷宫,可以用一组10个10维的向量来做,向量内容为0或1随机数即可
参考gpt:
这段代码实现了一个简单的随机生成迷宫并打印出来的功能。根据你的描述,代码运行后只出现一个黑窗口而没有任何内容显示。
这个问题可能是因为代码中的迷宫打印部分存在一些问题。你可以尝试修改printMaze函数来解决这个问题。在代码中,墙用"■"字符表示,路径用两个空格表示。
请将以下代码替换掉原来的printMaze函数部分:
//打印迷宫
int printMaze(int row, int col)
{
int i, j;
for (i = 0; i < row; i++)
{
for (j = 0; j < col; j++)
{
if (maze[i][j] == WALL)
printf("■");
if (maze[i][j] == PATH)
printf(" ");
}
printf("\n");
}
return 0;
}
如果问题仍然存在,请确保你的编译器和环境设置正确,并且能够正确地运行C语言程序。如果你使用的是IDE,可以尝试在IDE的设置中查找是否有相关的配置选项,例如确保输出窗口能够正确显示程序的输出。
另外,请确保你已经正确包含了所需的头文件(例如stdio.h、stdlib.h和time.h),并且编译器能够找到这些头文件。如果有其他的编译器警告或错误信息,请检查并修复这些问题。
希望这些信息对你有所帮助,如果还有其他问题,请随时提问。
试试这个
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#include<conio.h>
struct Node
{
int data;
int flag;
};
struct Path
{
int xpath;
int ypath;
int pox; //在队列中的下标
};
//全局变量
int n, m; //迷宫的行和列
Node* maze; //迷宫存放
Path* que;
int top = -1;
int front = -1;
int rear = -1;
void create()
{
int i, j;
printf("输入迷宫(随机生成)的行和列:");
scanf("%d%d", &n, &m);
maze = new Node[n * m];
srand(time(NULL));
for (i = 0; i < n; i++)
{
for (j = 0; j < m; j++)
{
int temp = rand() % 4;
if (temp != 1) maze[i * m + j].data = 1;
else maze[i * m + j].data = 0;
maze[i * m + j].flag = 0;
}
}
maze[0].data = 8; //设置起点
maze[n * m - 1].data = 1;
printf("生成迷宫:\n");
for (int i = 0; i < n; i++)
{
for (int j = 0; j < m; j++)
{
printf("%d", maze[i * m + j].data);
}
printf("\n");
}
}
int judge_head()
{
int k = 1;
if (que[front].xpath == n - 1 && que[front].ypath == m - 1)
{
printf("找到迷宫的通路!\n");
int x = que[front].xpath;
int y = que[front].ypath;
int t = que[front].pox; //前一个坐标在队列的下标
while (x != 0 || y != 0)
{
maze[x * m + y].data = 8;
x = que[t].xpath;
y = que[t].ypath;
t = que[t].pox;
k++;
}
for (int i = 0; i < n; i++)
{
for (int j = 0; j < m; j++)
{
printf("%d", maze[i * m + j].data);
}
printf("\n");
}
printf("路径长度为:%d\n", k);
return 1;
}
return 0;
}
void push_road(int x, int y)
{
if (maze[x * m + y].data == 1 && maze[x * m + y].flag == 0)
{
que[(++rear) % (n * m)].xpath = x;
que[rear % (n * m)].ypath = y;
que[rear % (n * m)].pox = front; //设置上一个坐标在队列中的位置
maze[x * m + y].flag = 1;
}
}
/*搜索路径*/
void seek_road() /*先实现一个路径先*/
{
//path = new Path[n*m];
int x1, y1;
que = new Path[n * m]; //利用广度优先实现最短路径
que[0].xpath = 0;
que[0].ypath = 0;
que[0].pox = 0;
maze[0].flag = 1;
rear++;
while (front != rear)
{
int x = que[(++front) % (n * m)].xpath; //获取队头的坐标,然后将其四周的通路进队,知道操作完队尾元素
int y = que[front % (n * m)].ypath;
// path[++top] = que[front];
if (judge_head()) return;
if (y + 1 < m)
push_road(x, y + 1);
if (x + 1 < n)
push_road(x + 1, y);
if (y - 1 >= 0)
push_road(x, y - 1);
if (x - 1 >= 0)
push_road(x - 1, y);
}
printf("没有通路!\n");
}
int main()
{
create();
seek_road();
return 0;
}
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define ROWS 10
#define COLS 20
int maze[ROWS][COLS];
void init_maze() {
int i, j;
for (i = 0; i < ROWS; i++) {
for (j = 0; j < COLS; j++) {
maze[i][j] = 1;
}
}
}
void print_maze() {
int i, j;
for (i = 0; i < ROWS; i++) {
for (j = 0; j < COLS; j++) {
if (maze[i][j] == 0) {
printf(" ");
} else {
printf("#");
}
}
printf("\n");
}
}
void generate_maze(int row, int col) {
maze[row][col] = 0;
int direction[4][2] = {{-1, 0}, {0, 1}, {1, 0}, {0, -1}};
int rand_dir[4];
int i, temp;
for (i = 0; i < 4; i++) {
rand_dir[i] = i;
}
for (i = 0; i < 4; i++) {
int r = rand() % 4;
temp = rand_dir[i];
rand_dir[i] = rand_dir[r];
rand_dir[r] = temp;
}
for (i = 0; i < 4; i++) {
int next_row = row + direction[rand_dir[i]][0] * 2;
int next_col = col + direction[rand_dir[i]][1] * 2;
if (next_row >= 0 && next_row < ROWS && next_col >= 0 && next_col < COLS) {
if (maze[next_row][next_col] == 1) {
maze[row + direction[rand_dir[i]][0]][col + direction[rand_dir[i]][1]] = 0;
generate_maze(next_row, next_col);
}
}
}
}
int main() {
srand(time(NULL));
init_maze();
generate_maze(1, 1);
print_maze();
return 0;
}