#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define ROW 20 // 迷宫行数
#define COL 20 // 迷宫列数
typedef struct {
int row; // 行号
int col; // 列号
} Point;
typedef struct {
Point data[ROW * COL]; // 存放队列元素的数组
int front; // 队头指针
int rear; // 队尾指针
} Queue;
// 初始化队列
void initQueue(Queue *queue) {
queue->front = 0;
queue->rear = 0;
}
// 判断队列是否为空
int isQueueEmpty(Queue *queue) {
return queue->front == queue->rear;
}
// 入队操作
void enqueue(Queue *queue, Point point) {
queue->data[queue->rear++] = point;
}
// 出队操作
Point dequeue(Queue *queue) {
return queue->data[queue->front++];
}
int findPath(int maze[][COL]);
// 随机生成迷宫
void generateMaze(int maze[][COL]) {
int i, j;
srand(time(NULL)); // 初始化随机数种子
// 初始化迷宫
for (i = 0; i < ROW; i++) {
for (j = 0; j < COL; j++) {
if (i == 0 || j == 0 || i == ROW - 1 || j == COL - 1) {
// 周围一圈设置为墙
maze[i][j] = 1;
} else {
// 其他位置随机设置为墙或路径
maze[i][j] = rand() % 2;
}
}
}
// 确保迷宫至少存在一条路径
while (1) {
int maze_copy[ROW][COL];
for (i = 0; i < ROW; i++) {
for (j = 0; j < COL; j++) {
maze_copy[i][j] = maze[i][j];
}
}
if (findPath(maze_copy)) {
break;
} else {
for (i = 1; i < ROW - 1; i++) {
for (j = 1; j < COL - 1; j++) {
maze[i][j] = rand() % 2;
}
}
}
}
}
// 打印迷宫
void printMaze(int maze[][COL]) {
int i, j;
for (i = 0; i < ROW; i++)
{
for (j = 0; j < COL; j++)
{
if (maze[i][j] == 1)
{
system("color FC");
printf("#");
} else if (maze[i][j] == 2)
{
// 路径用绿色表示
system("color FA");
printf("@");
} else
{
// 其他位置用白色表示
printf(" ");
}
}
printf("\n");
}
}
// 判断是否为有效位置
int isValid(int maze[][COL], int row, int col) {
return row >= 0 && row < ROW && col >= 0 && col < COL && (maze[row][col] == 0 || maze[row][col] == 2);
}
// 广度优先遍历寻找路径
int findPath(int maze[][COL]) {
Queue queue;
Point start = {1, 0}; // 起点
Point end = {ROW - 2, COL - 1}; // 终点
Point curr, next;
int i, row, col;
int visited[ROW][COL] = {0}; // 记录是否已经访问过
initQueue(&queue);
enqueue(&queue, start);
visited[start.row][start.col] = 1;
while (!isQueueEmpty(&queue)) {
curr = dequeue(&queue);
if (curr.row == end.row && curr.col == end.col) {
// 已到达终点
maze[curr.row][curr.col] = 2;
return 1;
}
// 向上走
row = curr.row - 1;
col = curr.col;
if (isValid(maze, row, col) && !visited[row][col]) {
next.row = row;
next.col = col;
enqueue(&queue, next);
visited[row][col] = 1;
}
// 向下走
row = curr.row + 1;
col = curr.col;
if (isValid(maze, row, col) && !visited[row][col]) {
next.row = row;
next.col = col;
enqueue(&queue, next);
visited[row][col] = 1;
}
// 向左走
row = curr.row;
col = curr.col - 1;
if (isValid(maze, row, col) && !visited[row][col]) {
next.row = row;
next.col = col;
enqueue(&queue, next);
visited[row][col] = 1;
}
// 向右走
row = curr.row;
col = curr.col + 1;
if (isValid(maze, row, col) && !visited[row][col]) {
next.row = row;
next.col = col;
enqueue(&queue, next);
visited[row][col] = 1;
}
// 标记当前位置已经访问过
maze[curr.row][curr.col] = 2;
}
return 0;
}
int main() {
int maze[ROW][COL];
generateMaze(maze);
printf("迷宫:\n");
printMaze(maze);
if (findPath(maze)) {
printf("找到了一条路径:\n");
printMaze(maze);
} else {
printf("没有找到路径。\n");
}
return 0;
}
运行后只出现黑框,显示无错误,无警告,咋办
需要注意的是,该程序的输出界面使用了Windows系统下的控制台颜色设置,可能在其他操作系统和终端下无法正常显示颜色。可以尝试修改程序中使用控制台颜色的部分,在其他操作系统和终端下以不同的方式展示路径和墙壁。比如,可以使用 ASCII 字符集中的字符代替颜色,或者使用 ANSI Escape Codes 来设置文本颜色和背景色等。另外,也可以考虑使用图形界面来展示迷宫和路径,这样可以避免因为终端上的限制而产生的不便。
在你提供的代码中,迷宫的生成和路径搜索部分都是正确的,没有明显的错误。问题可能是在打印迷宫时,使用了system("color FC")和system("color FA")来设置控制台输出颜色,但可能不是所有的终端都支持这些命令。
你可以尝试删除这两行代码,只保留printf语句来打印迷宫,看看能否正常显示迷宫。
修改printMaze函数修改为:
void printMaze(int maze[][COL]) {
int i, j;
for (i = 0; i < ROW; i++) {
for (j = 0; j < COL; j++) {
if (maze[i][j] == 1) {
printf("\033[31m#\033[0m"); // 红色
} else if (maze[i][j] == 2) {
printf("\033[32m@\033[0m"); // 绿色
} else {
printf(" ");
}
}
printf("\n");
}
}
应该就可以啦,
可以参考下
#include<stdio.h>//printf("");的头文件
#include<stdlib.h>//system("");的头文件
#include<Windows.h>//Sleep();的头文件
#include<conio.h>//getch();的头文件
int m1ain(void)
{
printf("欢迎来到迷宫小游戏\n");//介绍这个迷宫游戏
printf("操作方式:\nw为往上走\ns为往下走\na为往左走\nd为往右走\n");//介绍操作方式
char map[50][50]={
"######",//申请50*50的二维字符串当迷宫地图,但这里是6*6的地图
"#O # ",//'#'是墙(不可以走的地方)
"# ## #",//'O'是起点(可控制)
"# # #",//' '是空气(可以走的地方)
"## #",
"######",//横竖都是012345,012345(数组下标从0开始)
};
int i,x,y,p,q;//x,y为小球(起点"O")初始位置竖横轴
//p,q为空白(终点" ")结束位置竖横轴
int ch;//申请需要输入的字符(名称是ch),当移动(w,a,s,d)
x=1;y=1;p=1;q=5;//x为竖轴初始位置为1,y为初始横轴位置为1
//p为竖轴结束位置为1,q为结束横轴位置为5
for(i=0;i<6;i++)//从0到5,共进行了6次循环,依次输出迷宫的第0至5行
puts(map[i]);//表示输出每一行的字符串
while (x!=p||y!=q)//只要x的值不等p或y的值不等q就无限循环
{
ch=getch();//这语句表示给ch变量输入的字符可以立即被程序获取(不用按任意键继续),也不会回显
if(ch=='s')//判断你是否输入(按)'s'这个字符
{
if(map[x+1][y]!='#')//确认输入(按)的是's'时,就执行[x+1][y](往下走,x为竖轴,+1为往下,y不变),提前是还要判断往下走是否为'#'(墙)
{
map[x][y]=' ';//确认往下走不是墙时,把当前的'O'输出成' '
x++;//为向下走
map[x][y]='O';//确认往下走不是墙时,把下一步的' '输出成'O'
}
}
if(ch=='w')//判断你是否输入(按)'w'这个字符
{
if(map[x-1][y]!='#')//确认输入(按)的是'w'时,就执行[x-1][y](往上走,x为竖轴,-1为往上,y不变),提前是还要判断往下走是否为'#'(墙)
{
map[x][y]=' ';//确认往上走不是墙时,把当前的'O'输出成' '
x--;//为向上走
map[x][y]='O';//确认往上走不是墙时,把下一步的' '输出成'O'
}
}
if(ch=='a')//判断你是否输入(按)'a'这个字符
{
if(map[x][y-1]!='#')//确认输入(按)的是'a'时,就执行[x][y-1](往左走,y为横轴,-1为往左,x不变),提前是还要判断往下走是否为'#'(墙)
{
map[x][y]=' ';//确认往左走不是墙时,把当前的'O'输出成' '
y--;//为向左走
map[x][y]='O';//确认往左走不是墙时,把下一步的' '输出成'O'
}
}
if(ch=='d')//判断你是否输入(按)'d'这个字符
{
if(map[x][y+1]!='#')//确认输入(按)的是'd'时,就执行[x][y-1](往右走,y为横轴,+1为往右,x不变),提前是还要判断往下走是否为'#'(墙)
{
map[x][y]=' ';//确认往右走不是墙时,把当前的'O'输出成' '
y++;//为向右走
map[x][y]='O';//确认往右走不是墙时,把下一步的' '输出成'O'
}
}
system("cls");//每次移动了小球就清屏一次
for(i=0;i<6;i++)//清屏了再次循环输出新的地图
puts(map[i]);//清屏了再次输出新的地图
}
system("cls");//最后通关后清屏
printf("恭喜你赢了!\n");//最后通关后提示输出语句
Sleep(5000);//上面代码全部执行完毕后过五秒自动关闭程序
return 0;
}
不知道你这个问题是否已经解决, 如果还没有解决的话:我们先看10以内素数和是不是17:
0x11就是十进制的17,符合要求,再看看100(0x64)以内的结果:
迷宫问题中无法运行,又没有报错,说明很可能是没有执行到正确的代码,代码逻辑上还存在问题,比如没有调用执行迷宫求解的函数,或者条件语句写的有问题,没有进入到正确的代码分枝,或者进入了一个死循环,导致程序一直停留在某个地方,从而没有出结果,也没有报错的现象。建议对代码进行逐行检查,利用调试功能进行定位。
我稍微执行了下你的代码,报了一个Time limit exceeded的错误,所以大概率是进入到另一个死循环的原因。你根据我的思路再调试下代码看下。
删除system("color FC")、system("color FA")这两行试试
程序设计得不好,你是随机生成一副图然后判断是否有出去路径,如果运气不好需要很久才能生成一副有出去路径的迷宫,那个时候你的黑框框才会显示内容。运气好几秒钟就生成了,运气不好几天都没找到符合的结果
参考gpt:
代码中的问题在于使用了 system("color FC") 和 system("color FA") 来设置控制台输出的颜色,但这种方式可能在某些系统或环境下无法正常工作,导致没有正确显示迷宫。
如果你想在控制台中正确显示迷宫,可以尝试修改 printMaze 函数,使用不同的方式来显示墙、路径和空白位置。
以下是修改后的 printMaze 函数的示例代码:
// 打印迷宫
void printMaze(int maze[][COL]) {
int i, j;
for (i = 0; i < ROW; i++) {
for (j = 0; j < COL; j++) {
if (maze[i][j] == 1) {
printf("#"); // 墙用 # 表示
} else if (maze[i][j] == 2) {
printf("@"); // 路径用 @ 表示
} else {
printf(" "); // 其他位置用空格表示
}
}
printf("\n");
}
}
修改后的代码会直接使用字符来表示墙、路径和空白位置,而不依赖于控制台的颜色设置。重新编译和运行代码后,应该能够正确输出迷宫。
希望这次能够正确显示迷宫!如果你还有其他问题,请随时提问。
该代码存在一些问题:
windows.h
和 conio.h
,这两个头文件在 Windows 平台上用于控制台界面相关的操作,但在单片机上不需要使用这些函数。system
函数来修改控制台的颜色,但在单片机上无法直接使用该函数。针对这些问题,我可以做出如下改进:
windows.h
和 conio.h
相关代码)。下面是改进后的代码:
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <reg52.h> // 单片机头文件,具体根据使用的单片机型号而定
#define ROW 20 // 迷宫行数
#define COL 20 // 迷宫列数
typedef struct {
int row; // 行号
int col; // 列号
} Point;
typedef struct {
Point data[ROW * COL]; // 存放队列元素的数组
int front; // 队头指针
int rear; // 队尾指针
} Queue;
// 初始化队列
void initQueue(Queue *queue) {
queue->front = 0;
queue->rear = 0;
}
// 判断队列是否为空
int isQueueEmpty(Queue *queue) {
return queue->front == queue->rear;
}
// 入队操作
void enqueue(Queue *queue, Point point) {
queue->data[queue->rear++] = point;
}
// 出队操作
Point dequeue(Queue *queue) {
return queue->data[queue->front++];
}
int findPath(int maze[][COL]);
// 随机生成迷宫
void generateMaze(int maze[][COL]) {
int i, j;
srand(time(NULL)); // 初始化随机数种子
// 初始化迷宫
for (i = 0; i < ROW; i++) {
for (j = 0; j < COL; j++) {
if (i == 0 || j == 0 || i == ROW - 1 || j == COL - 1) {
// 周围一圈设置为墙
maze[i][j] = 1;
} else {
// 其他位置随机设置为墙或路径
maze[i][j] = rand() % 2;
}
}
}
// 确保迷宫至少存在一条路径
while (1) {
int maze_copy[ROW][COL];
for (i = 0; i < ROW; i++) {
for (j = 0; j < COL; j++) {
maze_copy[i][j] = maze[i][j];
}
}
if (findPath(maze_copy)) {
break;
} else {
for (i = 1; i < ROW - 1; i++) {
for (j = 1; j < COL - 1; j++) {
maze[i][j] = rand() % 2;
}
}
}
}
}
// 打印迷宫
void printMaze(int maze[][COL]) {
int i, j;
for (i = 0; i < ROW; i++) {
for (j = 0; j < COL; j++) {
if (maze[i][j] == 1) {
printf("#");
} else if (maze[i][j] == 2) {
// 路径用绿色表示
printf("@");
} else {
// 其他位置用白色表示
printf(" ");
}
}
printf("\n");
}
}
// 判断是否为有效位置
int isValid(int maze[][COL], int row, int col) {
return row >= 0 && row < ROW && col >= 0 && col < COL && (maze[row][col] == 0 || maze[row][col] == 2);
}
// 广度优先遍历寻找路径
int findPath(int maze[][COL]) {
Queue queue;
Point start = {1, 0}; // 起点
Point end = {ROW - 2, COL - 1}; // 终点
Point curr, next;
int i, row, col;
int visited[ROW][COL] = {0}; // 记录是否已经访问过
initQueue(&queue);
enqueue(&queue, start);
visited[start.row][start.col] = 1;
while (!isQueueEmpty(&queue)) {
curr = dequeue(&queue);
if (curr.row == end.row && curr.col == end.col) {
// 已到达终点
maze[curr.row][curr.col] = 2;
return 1;
}
// 向上走
row = curr.row - 1;
col = curr.col;
if (isValid(maze, row, col) && !visited[row][col]) {
next.row = row;
next.col = col;
enqueue(&queue, next);
visited[row][col] = 1;
}
// 向下走
row = curr.row + 1;
col = curr.col;
if (isValid(maze, row, col) && !visited[row][col]) {
next.row = row;
next.col = col;
enqueue(&queue, next);
visited[row][col] = 1;
}
// 向左走
row = curr.row;
col = curr.col - 1;
if (isValid(maze, row, col) && !visited[row][col]) {
next.row = row;
next.col = col;
enqueue(&queue, next);
visited[row][col] = 1;
}
// 向右走
row = curr.row;
col = curr.col + 1;
if (isValid(maze, row, col) && !visited[row][col]) {
next.row = row;
next.col = col;
enqueue(&queue, next);
visited[row][col] = 1;
}
// 标记当前位置已经访问过
maze[curr.row][curr.col] = 2;
}
return 0;
}
void inputPassword(int maze[][COL]) {
int password[4]; // 存放密码的数组
int i, row, col;
printf("请输入四位密码(每位密码为0-9之间的数字):\n");
for (i = 0; i < 4; i++) {
// 从矩阵键盘获取密码的行号和列号
// 在此处添加代码,使用单片机的矩阵键盘读取行号和列号,并将其赋值给row和col变量
// 例如:
// row = readRowFromKeypad();
// col = readColFromKeypad();
// 将行号和列号转换为在maze数组中的位置
row = 2 * row + 1;
col = 2 * col + 1;
// 将密码的数字保存到迷宫中
maze[row][col] = i + 1;
password[i] = i + 1;
}
printf("输入的密码为:");
for (i = 0; i < 4; i++) {
printf("%d", password[i]);
}
printf("\n");
}
int main() {
int maze[ROW][COL];
generateMaze(maze);
printf("迷宫:\n");
printMaze(maze);
inputPassword(maze);
if (findPath(maze)) {
printf("找到了一条路径:\n");
printMaze(maze);
} else {
printf("没有找到路径。\n");
}
return 0;
}
请注意,上述代码只是在代码结构上进行了修改,对于矩阵键盘的具体读取过程和密码存储的方式需要根据单片机型号和矩阵键盘的具体接口进行相应的修改和实现。