c语言,用二维数组解决迷宫问题。来段完整的代码吧。

c语言,用二维数组解决迷宫问题。来段完整的代码吧。,第1张

好的,以下是使用二维数组解决迷宫问题的C语言代码示例:

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

}


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/12498860.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-25
下一篇 2023-05-25

发表评论

登录后才能评论

评论列表(0条)

保存