Copy code
#include <stdio.h>
#define ROW 6 // 迷宫行数
#define COL 6 // 迷宫列数
int maze[ROW][COL] = { // 迷宫地图 1表示障碍,0表示通路
{1, 1, 1, 1, 1, 1},
{1, 0, 0, 1, 0, 1},
{1, 0, 0, 1, 0, 1},
{1, 0, 0, 0, 0, 1},
{1, 0, 1, 1, 0, 1},
{1, 1, 1, 1, 1, 1},
}
int result[ROW][COL] // 存放走迷宫的结果
int dfs(int row, int col) {
if (row == ROW - 1 &&col == COL - 1) { // 到达终点
result[row][col] = 1
return 1
}
if (maze[row][col] == 0) { // 当前位置是通路
result[row][col] = 1
if (row <ROW - 1 &&dfs(row + 1, col)) { // 向下走有解
return 1
}
if (col <COL - 1 &&dfs(row, col + 1)) { // 向右走有解
return 1
}
result[row][col] = 0// 标记羡谈走过的路
}
return 0 // 返回无解
}
void print_result() {
printf("走迷宫的结果:\n")
for (int i = 0i <搏碰 ROWi++) {
for (int j = 0j <COLj++) {
printf("%d ", result[i][j])
}
printf("\n")
}
}
int main() {
if (dfs(0, 0)) { // 从起点开始走迷宫
print_result()
} else {
printf("无法走出迷宫!\n")
}
return 0
}
上述代码中,我们使用兄银碰了一个二维数组 maze 来表示迷宫地图,其中 1 表示障碍,0 表示通路;另一个二维数组 result 用来存储走迷宫的结果,其中 1 表示该位置走通了, 0 表示该位置没有走通。
我们使用 dfs 函数来进行深度优先搜索,从起点 (0, 0) 开始往下、往右走,直到走到终点 (ROW-1, COL-1),如果存在通路,则将路径标记在 result 数组中,并返回 1,否则返回 0 表示无解。
最后,我们在 main 函数中调用 dfs 函数,判断是否能从起点走出迷宫,如果有解,则输出走迷宫的结果;否则,输出 "无法走出迷宫" 的提示。
#include \x0d\x0a#include \x0d\x0a#define M 15 \x0d\x0a#define N 15 \x0d\x0astruct mark //定义迷宫内点的坐标类型 \x0d\x0a{ \x0d\x0aint x\x0d\x0aint y\x0d\x0a}\x0d\x0a\x0d\x0astruct Element //"恋"栈元素,嘿嘿。。 \x0d\x0a{ \x0d\x0aint x,y//x行,y列 \x0d\x0aint d//d下一步的方向 \x0d\x0a}\x0d\x0a\x0d\x0atypedef struct LStack //链栈 \x0d\x0a{ \x0d\x0aElement elem\x0d\x0astruct LStack *next\x0d\x0a}*PLStack\x0d\x0a\x0d\x0a/*************栈函数****************/ \x0d\x0a\x0d\x0aint InitStack(PLStack &S)//构造空栈 \x0d\x0a{ \x0d\x0aS=NULL\x0d\x0areturn 1\x0d\x0a} \x0d\x0a\x0d\x0aint StackEmpty(PLStack S)//判断栈是否为空 \x0d\x0a{ \x0d\x0aif(S==NULL) \x0d\x0areturn 1\x0d\x0aelse \x0d\x0areturn 0\x0d\x0a} \x0d\x0a\x0d\x0aint Push(PLStack &S, Element e)//压入新数据元素 \x0d\x0a{ \x0d\x0aPLStack p\x0d\x0ap=(PLStack)malloc(sizeof(LStack))\x0d\x0ap->elem=e\x0d\x0ap->next=S\x0d\x0aS=p\x0d\x0areturn 1\x0d\x0a} \x0d\x0a\x0d\x0aint Pop(PLStack &S,Element &e) //栈顶元素出栈 \x0d\x0a{ \x0d\x0aPLStack p\x0d\x0aif(!StackEmpty(S)) \x0d\x0a{ \x0d\x0ae=S->elem\x0d\x0ap=S\x0d\x0aS=S->next\x0d\x0afree(p)\x0d\x0areturn 1\x0d\x0a} \x0d\x0aelse \x0d\x0areturn 0\x0d\x0a} \x0d\x0a\x0d\x0a/***************求迷宫路径锋雹函数***********************/ \x0d\x0avoid MazePath(struct mark start,struct mark end,int maze[M][N],int diradd[4][2]) \x0d\x0a{ \x0d\x0aint i,j,dint a,b\x0d\x0aElement elem,e\x0d\x0aPLStack S1, S2\x0d\x0aInitStack(S1)\x0d\x0aInitStack(S2)\x0d\x0amaze[start.x][start.y]=2//入口点作上标记 \x0d\x0aelem.x=start.x\x0d\x0aelem.y=start.y\x0d\x0aelem.d=-1//开始为-1 \x0d\x0aPush(S1,elem)\x0d\x0awhile(!StackEmpty(S1)) //栈不为空 有路径可走 \x0d\x0a{ \x0d\x0aPop(S1,elem)\x0d\x0ai=elem.x\x0d\x0aj=elem.y\x0d\x0ad=elem.d+1//下一个方向 \x0d\x0awhile(d(%d,%d,%d)",e.x,e.y,e.d)\x0d\x0a} \x0d\x0areturn//跳出两层循环,本来乎基衫用break,但发现出错,exit又会岁腔结束程序,选用return还是不错滴\x0d\x0a} \x0d\x0aif(maze[a][b]==0) //找到可以前进的非出口的点 \x0d\x0a{ \x0d\x0amaze[a][b]=2//标记走过此点 \x0d\x0aelem.x=i\x0d\x0aelem.y=j\x0d\x0aelem.d=d\x0d\x0aPush(S1,elem)//当前位置入栈 \x0d\x0ai=a//下一点转化为当前点 \x0d\x0aj=b\x0d\x0ad=-1\x0d\x0a} \x0d\x0ad++\x0d\x0a} \x0d\x0a} \x0d\x0aprintf("没有找到可以走出此迷宫的路径\n")\x0d\x0a} \x0d\x0a\x0d\x0a/*************建立迷宫*******************/ \x0d\x0avoid initmaze(int maze[M][N]) \x0d\x0a{ \x0d\x0aint i,j\x0d\x0aint m,n//迷宫行,列 [/M] \x0d\x0a\x0d\x0aprintf("请输入迷宫的行数 m=")\x0d\x0ascanf("%d",&m)\x0d\x0aprintf("请输入迷宫的列数 n=")\x0d\x0ascanf("%d",&n)\x0d\x0aprintf("\n请输入迷宫的各行各列:\n用空格隔开,0代表路,1代表墙\n",m,n)\x0d\x0afor(i=1i 回答于 2022-11-16#include <stdio.h>#include <conio.h>
#include <windows.h>
#include <time.h>
#define Height 31 //迷宫的高度,必须为奇数
#define Width 25 //迷宫的宽度,必须为奇数
#define Wall 1
#define Road 0
#define Start 2
#define End 3
#define Esc 5
#define Up 1
#define Down 2
#define Left 3
#define Right 4
int map[Height+2][Width+2]
void gotoxy(int x,int y) //移动坐标
{
COORD coord
coord.X=x
coord.Y=y
SetConsoleCursorPosition( GetStdHandle( STD_OUTPUT_HANDLE ), coord )
}
void hidden()//隐藏光标
{
HANDLE hOut = GetStdHandle(STD_OUTPUT_HANDLE)
CONSOLE_CURSOR_INFO cci
GetConsoleCursorInfo(hOut,&cci)
cci.bVisible=0//赋1为显示,赋0为隐藏
SetConsoleCursorInfo(hOut,&cci)
}
void create(int x,int y) //随机生成迷宫友圆
{
int c[4][2]={0,1,1,0,0,-1,-1,0} //四个方向
int i,j,t
//将方向打乱
for(i=0i<4i++)
{
j=rand()%4
t=c[i][0]c[i][0]=c[j][0]c[j][0]=t
t=c[i][1]c[i][1]=c[j][1]c[j][1]=t
}
map[x][y]=Road
for(i=0i<4i++)
if(map[x+2*c[i][0]][y+2*c[i][1]]==Wall)
{
map[x+c[i][0]][y+c[i][1]]=Road
create(x+2*c[i][0],y+2*c[i][1])
}
}
int get_key() //接收按键
{
char c
while(c=getch())
{
if(c==27) return Esc //Esc
if(c!=-32)continue
c=getch()
if(c==72) return Up //上
if(c==80) return Down //下
if(c==75) return Left //左
if(c==77) return Right //右
}
return 0
}
void paint(int x,int y) //画迷宫
{
gotoxy(2*y-2,x-1)
switch(map[x][y])
{
case Start:
printf("入")break //画入口
case End:
printf("出")break //画出口
case Wall:
printf("※")break //画墙
case Road:
printf(" ")break //画路
}
}
void game()
{
int x=2,y=1 //玩家当碧正前位置,刚开始在入口处
int c //用来接收按键
while(1)
{
gotoxy(2*y-2,x-1)
printf("☆") //画出玩家当前位置
if(map[x][y]==End) //判断是否到达出口
{
gotoxy(30,24)
printf("到达终点,按任意键结束")
getch()
break
}
c=get_key()
if(c==Esc)
{
gotoxy(0,24)
break
}
switch(c)
{
case Up: //向上走
if(map[x-1][y]!=Wall)
{
paint(x,y)
x--
}
break
case Down: //向下走
if(map[x+1][y]!=Wall)
{
paint(x,y)
x++
}
break
case Left: //向左好慧塌走
if(map[x][y-1]!=Wall)
{
paint(x,y)
y--
}
break
case Right: //向右走
if(map[x][y+1]!=Wall)
{
paint(x,y)
y++
}
break
}
}
}
int main()
{
int i,j
srand((unsigned)time(NULL)) //初始化随即种子
hidden() //隐藏光标
for(i=0i<=Height+1i++)
for(j=0j<=Width+1j++)
if(i==0||i==Height+1||j==0||j==Width+1) //初始化迷宫
map[i][j]=Road
else map[i][j]=Wall
create(2*(rand()%(Height/2)+1),2*(rand()%(Width/2)+1)) //从随机一个点开始生成迷宫,该点行列都为偶数
for(i=0i<=Height+1i++) //边界处理
{
map[i][0]=Wall
map[i][Width+1]=Wall
}
for(j=0j<=Width+1j++) //边界处理
{
map[0][j]=Wall
map[Height+1][j]=Wall
}
map[2][1]=Start //给定入口
map[Height-1][Width]=End //给定出口
for(i=1i<=Heighti++)
for(j=1j<=Widthj++) //画出迷宫
paint(i,j)
game() //开始游戏
getch()
return 0
}
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)