求解迷宫问题

raindream 2003-08-19 06:19:55
那位大侠能不能帮忙写一个求解迷宫的程序,小弟急需,多谢多谢了!!!!
今天编了一天没有编出来,很郁闷,小弟刚开始学,请帮忙大侠们!!!谢了!!谢了!!
...全文
53 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
raindream 2003-08-26
  • 打赏
  • 举报
回复
感谢大家的帮助,小弟终于用两个栈完成了迷宫的寻找,非常感谢!!!!
alemjann 2003-08-21
  • 打赏
  • 举报
回复
#include <stdio.h>

typedef struct hero {int x,y,face;} HERO;

void set_hero(HERO* h,int x,int y,int face){h->x=x;h->y=y;h->face=face;}

void go(HERO* h){if(h->face%2) h->x+=2-h->face;else h->y+=h->face-1;}

void goleft(HERO* h){if(h->face%2) h->y+=h->face-2;else h->x+=h->face-1;}

void turnleft(HERO* h){h->face=(h->face+3)%4;}


void turnright(HERO* h){h->face=(h->face+1)%4;}

void print_hero(HERO* h, int b)

{

gotoxy(h->x + 1, h->y + 1);

if (b)

{

switch (h->face)

{

case 0: printf("%c", 24); break;

case 1: printf("%c", 16); break;

case 2: printf("%c", 25); break;

case 3: printf("%c", 27); break;

default: break;

}

}

else printf(" ");

}

int maze[10][10] =

{

0, 0, 0, 1, 0, 0, 0, 1, 0, 0,

1, 0, 1, 1, 0, 1, 1, 1, 1, 0,

1, 0, 0, 0, 0, 0, 0, 0, 0, 0,

0, 0, 1, 0, 1, 1, 0, 1, 1, 1,

0, 0, 1, 0, 1, 1, 0, 0, 0, 1,

1, 0, 1, 0, 1, 1, 0, 1, 0, 1,

0, 0, 1, 0, 1, 1, 0, 1, 0, 1,

0, 1, 1, 0, 0, 0, 0, 1, 0, 1,

0, 0, 0, 0, 1, 0, 1, 1, 0, 1,

0, 1, 1, 1, 1, 0, 0, 0, 0, 0

};

void print_maze()

{

int i, j;

for (i = 0; i < 10; i++)

{

for (j = 0; j < 10; j++)

{

if (maze[i][j]) printf("%c", 219);

else printf(" ");

}

printf("\n");

}

}

int gomaze(HERO* h)

{

HERO t = *h; int i;

for (i = 0; i < 2; t = *h)

{

print_hero(h, 1); sleep(1); go(&t);

if (t.x >= 0 && t.x < 10 && t.y >= 0 && t.y < 10 && !maze[t.y][t.x])

{

print_hero(h, 0); go(h);/*前方可走则向前走*/

if (h->x == 9 && h->y == 9) return 1; goleft(&t);

if (h->x == 0 && h->y == 0) i++;

if (t.x >= 0 && t.x < 10 && t.y >= 0 && t.y < 10 && !maze[t.y][t.x]) turnleft(h);/*左方无墙向左转*/

}

else turnright(h);/*前方不可走向右转*/

}

return 0;

}



main()

{

HERO Tom;/*有个英雄叫Tom*/

set_hero(&Tom, 0, 0, 0);/*放在(0,0)面朝北*/

clrscr();

print_maze();

gomaze(&Tom);/*Tom走迷宫*/

}

kinogre 2003-08-21
  • 打赏
  • 举报
回复
classic stack practice
alemjann 2003-08-21
  • 打赏
  • 举报
回复
#include <stdio.h>

typedef struct hero {int x,y,face;} HERO;

void set_hero(HERO* h,int x,int y,int face){h->x=x;h->y=y;h->face=face;}

void go(HERO* h){if(h->face%2) h->x+=2-h->face;else h->y+=h->face-1;}

void goleft(HERO* h){if(h->face%2) h->y+=h->face-2;else h->x+=h->face-1;}

void turnleft(HERO* h){h->face=(h->face+3)%4;}


void turnright(HERO* h){h->face=(h->face+1)%4;}

void print_hero(HERO* h, int b)

{

gotoxy(h->x + 1, h->y + 1);

if (b)

{

switch (h->face)

{

case 0: printf("%c", 24); break;

case 1: printf("%c", 16); break;

case 2: printf("%c", 25); break;

case 3: printf("%c", 27); break;

default: break;

}

}

else printf(" ");

}

int maze[10][10] =

{

0, 0, 0, 1, 0, 0, 0, 1, 0, 0,

1, 0, 1, 1, 0, 1, 1, 1, 1, 0,

1, 0, 0, 0, 0, 0, 0, 0, 0, 0,

0, 0, 1, 0, 1, 1, 0, 1, 1, 1,

0, 0, 1, 0, 1, 1, 0, 0, 0, 1,

1, 0, 1, 0, 1, 1, 0, 1, 0, 1,

0, 0, 1, 0, 1, 1, 0, 1, 0, 1,

0, 1, 1, 0, 0, 0, 0, 1, 0, 1,

0, 0, 0, 0, 1, 0, 1, 1, 0, 1,

0, 1, 1, 1, 1, 0, 0, 0, 0, 0

};

void print_maze()

{

int i, j;

for (i = 0; i < 10; i++)

{

for (j = 0; j < 10; j++)

{

if (maze[i][j]) printf("%c", 219);

else printf(" ");

}

printf("\n");

}

}

int gomaze(HERO* h)

{

HERO t = *h; int i;

for (i = 0; i < 2; t = *h)

{

print_hero(h, 1); sleep(1); go(&t);

if (t.x >= 0 && t.x < 10 && t.y >= 0 && t.y < 10 && !maze[t.y][t.x])

{

print_hero(h, 0); go(h);/*前方可走则向前走*/

if (h->x == 9 && h->y == 9) return 1; goleft(&t);

if (h->x == 0 && h->y == 0) i++;

if (t.x >= 0 && t.x < 10 && t.y >= 0 && t.y < 10 && !maze[t.y][t.x]) turnleft(h);/*左方无墙向左转*/

}

else turnright(h);/*前方不可走向右转*/

}

return 0;

}



main()

{

HERO Tom;/*有个英雄叫Tom*/

set_hero(&Tom, 0, 0, 0);/*放在(0,0)面朝北*/

clrscr();

print_maze();

gomaze(&Tom);/*Tom走迷宫*/

}

alemjann 2003-08-21
  • 打赏
  • 举报
回复
#include <stdio.h>

typedef struct hero {int x,y,face;} HERO;

void set_hero(HERO* h,int x,int y,int face){h->x=x;h->y=y;h->face=face;}

void go(HERO* h){if(h->face%2) h->x+=2-h->face;else h->y+=h->face-1;}

void goleft(HERO* h){if(h->face%2) h->y+=h->face-2;else h->x+=h->face-1;}

void turnleft(HERO* h){h->face=(h->face+3)%4;}


void turnright(HERO* h){h->face=(h->face+1)%4;}

void print_hero(HERO* h, int b)

{

gotoxy(h->x + 1, h->y + 1);

if (b)

{

switch (h->face)

{

case 0: printf("%c", 24); break;

case 1: printf("%c", 16); break;

case 2: printf("%c", 25); break;

case 3: printf("%c", 27); break;

default: break;

}

}

else printf(" ");

}

int maze[10][10] =

{

0, 0, 0, 1, 0, 0, 0, 1, 0, 0,

1, 0, 1, 1, 0, 1, 1, 1, 1, 0,

1, 0, 0, 0, 0, 0, 0, 0, 0, 0,

0, 0, 1, 0, 1, 1, 0, 1, 1, 1,

0, 0, 1, 0, 1, 1, 0, 0, 0, 1,

1, 0, 1, 0, 1, 1, 0, 1, 0, 1,

0, 0, 1, 0, 1, 1, 0, 1, 0, 1,

0, 1, 1, 0, 0, 0, 0, 1, 0, 1,

0, 0, 0, 0, 1, 0, 1, 1, 0, 1,

0, 1, 1, 1, 1, 0, 0, 0, 0, 0

};

void print_maze()

{

int i, j;

for (i = 0; i < 10; i++)

{

for (j = 0; j < 10; j++)

{

if (maze[i][j]) printf("%c", 219);

else printf(" ");

}

printf("\n");

}

}

int gomaze(HERO* h)

{

HERO t = *h; int i;

for (i = 0; i < 2; t = *h)

{

print_hero(h, 1); sleep(1); go(&t);

if (t.x >= 0 && t.x < 10 && t.y >= 0 && t.y < 10 && !maze[t.y][t.x])

{

print_hero(h, 0); go(h);/*前方可走则向前走*/

if (h->x == 9 && h->y == 9) return 1; goleft(&t);

if (h->x == 0 && h->y == 0) i++;

if (t.x >= 0 && t.x < 10 && t.y >= 0 && t.y < 10 && !maze[t.y][t.x]) turnleft(h);/*左方无墙向左转*/

}

else turnright(h);/*前方不可走向右转*/

}

return 0;

}



main()

{

HERO Tom;/*有个英雄叫Tom*/

set_hero(&Tom, 0, 0, 0);/*放在(0,0)面朝北*/

clrscr();

print_maze();

gomaze(&Tom);/*Tom走迷宫*/

}

flybird66 2003-08-21
  • 打赏
  • 举报
回复
用栈的方法比较好做,走过的路设个标识
98440622 2003-08-21
  • 打赏
  • 举报
回复
每个位置八个方向,用栈回溯,你会找到出口的:-)

Use your head, then you will find a way
idontlikenickname 2003-08-20
  • 打赏
  • 举报
回复


To:made_in_(潦倒)
一直右拐或左拐?如果要时遇到一个环形的地图怎么办?那就一直转下去永远也出不来了~
应该设置一个状态机,90%的几率右转,10%的几率左转,这样才"有可能"走出来~~

raindream 2003-08-19
  • 打赏
  • 举报
回复
补充一句,用从c++编.
made_in_ 2003-08-19
  • 打赏
  • 举报
回复
思想就是:当碰到拐弯口的时候,记住一直右拐或者一直左拐,这样就能找到出口了.
人工智能大作业-基于强化学习求解迷宫问题python实现源码+项目说明+实验报告+可执行文件 【项目介绍】 该资源内项目代码都是经过测试运行成功,功能ok的情况下才上传的,请放心下载使用! 本项目适合计算机相关专业(如计科、人工智能、通信工程、自动化、电子信息等)的在校学生、老师或者企业员工下载使用,也适合小白学习进阶, 或者实际项目借鉴参考! 当然也可作为毕设项目、课程设计、作业、项目初期立项演示等。如果基础还行,也可在此代码基础上进行修改,以实现其他功能。 强化学习求解迷宫问题 核心代码 - maze.py: 迷宫类的实现,迷宫信息用一个二维数组表示,数组中的每个数代表一个方格,数字值代表方格类型(如0表示墙, 2表示陷阱, 3表示火)。 - train_qtable.py: Q表类的实现,Q表类有Q值的存储,决策的进行,Q表的学习等功能函数,进行预测和学习时会与迷宫(“环境”)进行交互,对其输入动作,得到反馈。 - train_network.py: 监督学习模型的学习,预测等实现。 - git.py: 监督学习用到的批量式学习仓库。 - maze_map.py: 存储6个事先定义好的迷宫 - draw.py: Q表的可视化以及完整走迷宫过程的呈现。 UI代码 - ui.py: 顶层窗口,有两个标签页 - ui_basic.py: “已有迷宫”标签页的实现,用户可以从我们定义好的几个迷宫中选择一个,进行训练并查看完整的走迷宫过程。 - ui_userDefine.py:“用户自定义”标签页的实现,用户可以输入任意大小的迷宫,自定义火焰周期,训练次数上限。之后进行训练,并以三种不同的速度查看完整的走迷宫结果。 - draw_ui.py: 在ui界面绘制Q表和走迷宫过程。 运行方法 - 打开“可执行文件/ui.exe” - 运行“代码/ui.py” - 运行“代码/train_qtable.py”,对maze_map中定义的迷宫进行训练,训练结束后显示Q表和完整走迷宫过程。 编译运行环境 python 3.6, pyqt 5.13.1, matplotlib 3.0.2, numpy 1.15.2, Pyinstaller 3.5

69,369

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧