当前位置:首页 » 操作系统 » 迷宫寻迹算法

迷宫寻迹算法

发布时间: 2022-08-20 05:54:07

❶ 回溯算法的基本思想

回溯算法的基本思想是:从一条路往前走,能进则进,不能进则退回来,换一条路再试。八皇后问题就是回溯算法的典型,第一步按照顺序放一个皇后,然后第二步符合要求放第2个皇后,如果没有位置符合要求,那么就要改变第一个皇后的位置,重新放第2个皇后的位置,直到找到符合条件的位置就可以了。回溯在迷宫搜索中使用很常见,就是这条路走不通,然后返回前一个路口,继续下一条路。回溯算法说白了就是穷举法。不过回溯算法使用剪枝函数,剪去一些不可能到达 最终状态(即答案状态)的节点,从而减少状态空间树节点的生成。回溯法是一个既带有系统性又带有跳跃性的的搜索算法。它在包含问题的所有解的解空间树中,按照深度优先的策略,从根结点出发搜索解空间树。算法搜索至解空间树的任一结点时,总是先判断该结点是否肯定不包含问题的解。如果肯定不包含,则跳过对以该结点为根的子树的系统搜索,逐层向其祖先结点回溯。否则,进入该子树,继续按深度优先的策略进行搜索。回溯法在用来求问题的所有解时,要回溯到根,且根结点的所有子树都已被搜索遍才结束。而回溯法在用来求问题的任一解时,只要搜索到问题的一个解就可以结束。这种以深度优先的方式系统地搜索问题的解的算法称为回溯法,它适用于解一些组合数较大的问题。

c语言走迷宫dfs用了迷宫,其中有回溯思想,就是走不通返回上一状态,

递归了吧。使用了系统栈,在递归结束时用了返回。根据栈的先进后出原则,就是一步步的在回溯了。

❸ C语言编程求解啊!利用回溯算法的迷宫搜索类型问题

#include "stdafx.h"
#include <iostream>
#include "cmath"
#include <fstream>

using namespace std ;

int ROW ;
int COL ;
int **g_pRoom ;

// 回溯法注意标记已访问过的节点。。。。。不然就会进入重复操作将栈用空。。。。。。。。
struct Point
{
Point( int xx = 0, int yy = 0 ):x(xx),y(yy) { }
int x ;
int y ;
} ;
int g_nMax = 0 ;
Point g_pResult[100] ;
int g_nCount ;
Point g_pStart ;
Point g_pEnd ;
Point g_pOrient[4] = { Point(-1, 0 ) , Point( 0 ,1 ) , Point( 1 ,0 ) , Point( 0 , -1 ) } ;
bool Read_data( ifstream &file )
{
if( file.eof() )
return false ;
g_nMax = 0 ;
g_nCount = 0 ;
file>>ROW>>COL ;
g_pRoom = new int*[ROW] ;
g_pStart = g_pEnd = Point( -1, -1 ) ;
for( int i = 0 ; i < ROW ; i++ )
g_pRoom[i] = new int[COL] ;
for( int i = 0 ; i < ROW ; i++ )
for( int j = 0 ; j < COL ; j++ )
{
file>>g_pRoom[i][j] ;
if( g_pRoom[i][j] == -1 )
{
g_pStart.x = j ;
g_pStart.y = i ;
}
else if( g_pRoom[i][j] == -2 )
{
g_pEnd.x = j ;
g_pEnd.y = i ;
}
}
if( g_pStart.x == -1 || g_pEnd.x == -1 )
{
cout<<" the data errror !\n" ;
return false ;
}
return true ;
}

void Dateback( Point pStart )
{
static Point Stack[1000] ;
static int nTop = 0 ;
static int Apple = 0 ;
if( pStart.x == g_pEnd.x && pStart.y == g_pEnd.y )
{
if( Apple + 2 > g_nMax )
{
g_nMax = Apple + 2 ;
for( int i = 0 ; i < nTop ; i++ )
g_pResult[i] = Stack[i] ;
g_nCount = nTop ;
} // ....
}
else
{
for( int i = 0 ; i < 4 ; i++ )
{
Point s ;
s.x = pStart.x + g_pOrient[i].x ;
s.y = pStart.y + g_pOrient[i].y ;
if( s.x >= 0 && s.x < COL && s.y >= 0 && s.y < ROW && g_pRoom[s.y][s.x] != 0 )
{
Apple += g_pRoom[s.y][s.x] ;
Stack[nTop++] = s ;
int temp = g_pRoom[s.y][s.x] ;
g_pRoom[s.y][s.x] = 0;
Dateback( s ) ;
nTop-- ;
g_pRoom[s.y][s.x] = temp ;
Apple -= g_pRoom[s.y][s.x] ;
}
}
}
}

int main()
{
ifstream file("data.txt") ;
Read_data(file) ;
Dateback( g_pStart ) ;
cout<<g_nMax ;
cout<<"("<<g_pStart.y<<","<<g_pStart.x<<")"<<" " ;
for( int i = 0 ; i < g_nCount ; i++ )
cout<<"("<<g_pResult[i].y<<","<<g_pResult[i].x<<")"<<" " ;
return 0 ;
}

❹ 怎么用回溯法来实现迷宫问题,其中用'*'来表示墙,用A来表示路径!!1

爱莲说
(宋)周敦颐
水陆草木之花,可爱者甚蕃。晋陶渊明独爱菊;自李唐来,世人盛爱牡丹;予独爱莲之出淤泥而不染,濯清涟而不妖,中通外直,不蔓不枝,香远益清,亭亭净植,可远观而不可亵玩焉。予谓菊,花之隐逸者也;牡丹,花之富贵者也;莲,花之君子者也。噫!菊之爱,陶后鲜有闻;莲之爱,同予者何人;牡丹之爱,宜乎众矣。

[注释]:
(1)爱莲说:选自《周元公集》。作者周敦颐着名的唯心主义哲学家。“说”,是古代论说文的一种体裁,可以说明事物,也可以论述道理。
(2)蕃:多。
(3)晋陶渊明独爱菊:陶渊明(365-427),一名潜,字符亮,东晋浔阳(现在江西省九江县)人,着名的诗人。他很爱菊花,常在诗里写到,如《饮酒》诗里的“采菊东篱下,悠然见南山”,向来称为名句。
(4)自李唐来,世人甚爱牡丹:唐朝以来,人们很爱牡丹。李唐,指唐朝。唐朝的皇帝姓李,所以称为“李唐”。世人,社会上的一般人。唐人爱牡丹,古书里有不少记载,如唐朝李肇的《唐国史补》里说:“京城贵游,尚牡丹……每春暮,车马若狂……种以求利,一本(一株)有直(同“值”)数万(指钱)者。”
(5)予独爱莲之出淤泥而不染:我单单喜欢莲花,喜欢它从污泥里生出却不被沾染。淤泥,池塘里积存的污泥。
(6)濯(zhuó)清涟而不妖:在清水里洗过却不妖艳。濯,洗涤。清涟,水清而有微波的样子,这里指清水。妖,美丽而不端庄。
(7)不蔓不枝:不牵牵连连的,不枝枝节节的。
(8)香远益清:香气越远越清。益,更,越。
(9)亭亭:耸立的样子。
(10)亵(xiè)玩:玩弄。亵,亲近而不庄重。
(11)隐逸者:隐居的人。封建社会里,有些人不愿意跟统治者同流合污,便隐居避世。
(12)牡丹,花之富贵者也:牡丹是花中的“富人”。
(13)君子:道德高尚的人。
(14)噫(yī):叹词,相当于“唉”。
(15)菊之爱:对于菊花的爱好。
(16)鲜(xiǎn)有闻:很少听到。鲜,少。
(17)宜乎:宜,当,这里和“乎”连用,有“当然”的意思。

[译文]:水上地上各种草和木的花,可爱的是很多的。晋朝陶渊明唯独喜爱菊花。从唐朝以来,世上的人们非常喜爱牡丹。我唯独喜爱莲花,它从污泥中长出来,却不受到污染,在清水里洗涤过但是不显得妖媚,它的茎中间贯通,外形挺直,不牵牵连连,不枝枝节节的,香气远播,更加清香,笔直地洁净地立在那里,可以远远地观赏但是不能贴近去轻慢地玩弄啊。
我认为,菊花是花中的隐士;牡丹,是花中的富贵者;莲花,是花中的君子。
唉!爱菊花的人,从陶渊明以后很少听到过。爱莲花的人,像我一样的人还有什么人呢?至于爱牡丹的人,人数当然就很多了!

“说”,古代文体之一,它往往借描绘事物以抒情言志。周敦颐的《爱莲说》正是这种托物言志的文体中一篇不可多得的传世佳作。

[赏析]:周敦颐,北宋人,其人一生澹泊名利,不求闻达。他的这种高洁的人品,诚如北宋文学大家黄庭坚所誉:“人品甚高,胸怀洒落,如光风霁月……”而他的传世散文佳作《爱莲说》恰恰正是他酒落胸怀所透射而出的精神折光。

莲花,是古往今来文人笔下高歌咏叹的对象,但大多数文人都是惊叹于它的清姿素容,并将其形诸笔端;而这笔散文精品却独辟蹊径,通过对莲的形象和品质的描写,歌颂了莲花坚贞的品格,从而也表现了作者洁身自爱的高洁人格和洒落的胸襟。

从内容上看,这篇文章可明显分为二部分:前一部分对莲花高洁的形象极尽铺排描绘之能事;第二部分则揭示了莲花的比喻义,分评三花,并以莲自况,抒发了作者内心深沉的概叹。

文章的前一部分,写出了莲花之美就在于其一个“洁”字。首先,“出淤而不染,濯清莲而不妖”写出了莲花身处污泥之中,却纤尘不染,不随世俗、洁身自爱和天真自然不显媚态的可贵精神;其次,“中通外直,不蔓不枝”,写出了它里外贯通、外表挺直、表里如一、不牵扯攀附的高尚品质;再次“可远观而不可亵玩”,写出了莲如傲然不群的君子一样,决不被俗人们轻慢玩弄。

前文所说的一切,事实上是作者人格的写照,是作者心志的自明,关于这一点,我们可以从文章的第二部分得到明证。正如作者所说:“莲之爱,同予者何人?”其间的潜台词就是感慨于象他一样具有莲花之洁的人实在太少了。

在写法上,《爱莲说》具有“说”这一文体的共同特点,即托物言志。文章从“出淤泥而不染”起,以浓墨重彩描绘了莲的气度、莲的风节,寄予了作者对理想人格的肯定和追求,也反射出作者鄙弃贪图富贵、追名逐利的世态的心理和自己追求洁身自好的美好情操。同时,文章还运用了对比,反衬的手法,在文中几次以菊、牡丹反衬莲之美;还把菊花的隐逸,牡丹的富贵和莲花的高洁相对比,使“爱莲”之一主题得以加深,没有空洞的说教,而是通过三种形象的对比,起到了突出中心,加深立意的作用,手法可谓高明之极。而且,文章以一个“爱”字贯通全文,使得文章结构谨严。 在文章结尾,作者一叹真正隐逸的高士极少,二叹品格高尚的君子罕见,三叹贪慕富贵的俗人很多,耐人寻味,发人深省。

这首诗在语言上也同样富有特色,那就是优美简炼,的确是如莲之美——“不枝不蔓”,没有多余的无用之语

莲花的美丽别称
(1)芙蓉:《尔雅》:“荷,芙蕖,别名芙蓉,亦作芙容。”
(2)芙蕖:《尔雅·释草》:“荷、芙蕖。……其华菡萏,其实莲,其根藕。”
(3)藕花: 唐张籍《送从弟之苏州》诗:“夜月红柑树,秋风白藕花。”
(4)水芙蓉:《群芳谱》:“荷花亦称作芙蕖、水芙蓉。”
(5)草芙蓉:杜诗注云:产于陆者曰木芙蓉,产于水者曰草芙蓉。”
(6) 水花:李时珍《本草纲目》:“莲花”释名:“芙蓉、芙蕖、水华。”
(7)净友又称净客。莲花洁净不染,因此人们称其为净友。
(8)水芝:普崔豹《古今注》下“草木”:“芙蓉一名荷华,一名水目,一名水芝,一名水花。”
(9)泽芝:《类聚》郭璞《尔雅图赞 ·芙蓉赞 》云:“芙蓉丽草,一曰泽芝,……”
(10) 灵草:吴闵鸿《芙蓉赋并序》:“乃有芙蓉灵草,栽育中川。”
(11)玉环:《本草经》载:“荷花又名玉芝。”
(12)君子花:北宋周敦颐着《爱莲说》,谓莲为花中君子,莲又称“君子花”。
(13) 水宫仙子:因莲生水中,莲花亭亭玉立于水面,好似仙女飘然而行,故名。
(14) 菡萏:《尔雅》:“荷,芙蕖……其华菡萏。”

莲花与佛教
据 说 ,释 迦 牟 尼 本 是 天 上 的 菩 萨 ,下 凡 降 生 到 迦 毗 罗 卫 国 净 饭 王 处 。 净 饭 王 的 王 妃 摩 耶 夫 人 , 长 得 象 天 仙 一 样 美 丽 , 性 情 温 和 贤 淑 , 与 国 王情 深 似 海 。摩 耶 夫 人 回 忆 新 婚 之 夜 , 她 朦 胧 中 看 到 远 处 有 一 个 人 骑 着 一头 白 象 向 她 走 来 并 且 逐 渐 变 小 , 从 她 的 右 肋 处 钻 入 她 的腹 中 。 她 心 中 模 模 糊 糊 地 预 感 到 菩 萨 化 作 一 头 白 象 入 胎。 日 后 , 身 怀 有 孕 的 摩 耶 夫 人 脸 上 , 微 微 泛 着 红 晕 , 那 色 彩 鲜 艳 的 绿 色 领 口 花 边 象 一 片 莲 叶 , 她 的 脸 儿 象 一 朵 绽 开 的 莲 花 。 后 来 摩 耶 夫 人 在 娑 罗 树 下 降 生 佛 祖 时 , 百 鸟 群 集 歌 唱 , 天 乐 鸣 空 相 和 , 四 季 里 的 花 木 都 一 同 盛 开, 尤 其 是 沼 泽 内 突 然 开 放 出 大 得 象 车 盖 一 样 的 莲 花 。 佛祖 一 出 世 , 便 站 在 莲 花 上 , 一 手 指 天 , 一 手 指 地 , 并 说: “ 天 上 天 下 , 惟 我 独 尊 ” 。
不 仅 如 此 , 莲 还 与 佛 教 医 学 有 着 密 切 关 系 。 莲 花 含 有 丰 富 的 营 养 , 既 可 食 用 又可 药 用 。 古 代 女 子 常 采 清 晨 带 露 的 莲 花 敷 面 美 容 , 或 服 食 莲 花 以 养 颜。 莲 花 含 有 皮 素 和 木 樨 素 ,能 润 泽 肤 色 。 初 放 鲜 嫩 的 莲 花 用 开 水 泡 饮 , 其 汁 翠 绿 清 香 , 有 清 暑 解 热 和 生 津 开 胃 之 功 效 。 莲 的 地 下 根 茎 称 为 莲 藕 。 相 传 佛 祖 的 十 大 弟 子之 一 舍 利 弗 患 有 肺 结 核 , 目 犍 连 来 探 望 他 , 并 得 知 舍 利 弗 喜 欢 吃 莲 藕 , 就 带 些 新 鲜 莲 藕 让 舍 利 弗 吃 , 舍 利 弗 吃 莲 藕 后 果 然 病 愈 。 后 来 , 佛 祖 弟 子 经 常 用 莲 藕 作 为 药 用来 治 病 , 并 发 现 了 莲 藕 的 许 多 药 用 价 值 。

莲花的美好品质
在千古第一诗人屈原的代表作 《离骚》中有这样的诗句“制芰荷以为衣兮,集芙蓉以为裳。”诗人为了表达自己不与世俗同流合污的决心,要穿上用莲花做成的香气馥郁的衣服。在这里,莲花这一形象,不仅象征着诗人高洁的品质和美好的修养,而且表现了诗人浓烈的激情和奇幻的想象以及《离骚》这首不朽杰作的浪漫主义特色。
“江南可采莲,莲叶何田田。鱼戏莲叶间。鱼戏莲叶东,鱼戏莲叶西,鱼戏莲叶南,鱼戏莲叶北。”这是汉代乐府民歌中的一首极为清新优美的小诗。在这首小诗中,“莲”既指实物花卉莲花,又是爱怜的“怜”谐音,以鱼戏莲叶隐喻男女之间的爱情,极其生动形象。在秀美的江南水乡的大背景中,采莲的男女主人公摇着小舟,自由地歌唱着纯洁美丽的爱情,该是一幅多么清新的图画!

“荷叶罗裙一色裁,芙蓉向脸两边开。乱入池中看不见,闻歌始觉有人来。”在唐代七绝圣手王昌龄的这首《采莲曲》中,采莲少女的美丽虽不着一字,却尽得风流,因为她们的身影已与风光秀丽、如诗如画的荷塘、莲花融为一体了。从这自然浑成、耐人寻味的意境中,我们不难感受到中国古典文学的魅力吧。
代表着南朝乐府民歌最高成就的《西洲曲》,更是对莲花和采莲有着细致入微的描写:“开门郎不至,出门采红莲。采莲南塘秋,莲花过人头。低头弄莲子,莲子青如水。置莲怀袖中,莲心彻底红。忆郎郎不至,仰首望飞鸿……”这首诗中采莲的情形,不仅生动地展示了江南水乡人民的生活,而且写出了采莲女主人公对远行丈夫深深的思念之情,语言清新明丽,意境悠远,情思缠绵。
以“诚斋体”闻名南宋诗坛的着名诗人杨万里的诗《晓出净慈寺送林子方》:“毕竟西湖六月中,风光不与四时同。接天莲叶无穷碧,映日荷花别样红。”在这首诗中,诗人撷取了“接天莲叶”和“映日荷花”两个典型景物,以通俗明快、流转圆活的风格,写出了六月里西湖的美丽风光,一改宋诗瘦硬生涩的弊端,极具自然灵性。
宋朝理学的创导者、哲学家周敦颐的《爱莲说》中有这样的句子:“予独爱莲之出淤泥而不染,濯清涟而不妖,中通外直,不蔓不枝,香远益清,亭亭静植,可远观而不可亵玩焉……莲,花之君子者也。”在这篇托物言志的散文中,作者从不同的角度、不同的方面写尽了莲花的高洁品质、优雅气质、优美的姿态和庄重的仪表,表达了封建士大夫高洁的情操和志趣。自此,莲花便有了灵性,步入花中君子之列。
明代的许仲琳,在其着名的神魔小说《封神演义》中,塑造了一个莲花化身的少年英雄哪咤的形象,他纯真勇敢而又法力高强,敢于蔑视神权、打抱不平,极具正义和反抗精神,是我国古典文学中为人民群众所喜爱的人物形象之一。透过哪咤这一神话人物形象,我们看到莲花又变成了正义和勇敢的化身。

一代散文大师朱自清的美文《荷塘月色》,通过高超的艺术手法和情景交融的意境营造,写出了月下荷塘素淡朦胧的美:“曲曲折折的荷塘上面,弥望的是田田的叶子……,层层的叶子中间,零星地点缀着些白花,有婀娜的开着的,有羞涩的打着朵儿的,正如一粒粒的明珠,又如碧天里的星星,微风过处,送来缕缕清香,仿佛远处高楼上渺茫的歌声似的……”月下的荷叶、荷花和荷塘,在现代作家朱自清的笔下简直就像一幅意境幽美的工笔画

❺ 请教高手C++数据结构回溯算法解,迷宫问题

//迷宫用栈做的
#include "stdio.h"
#include "stdlib.h"
#define INITSIZE 100
#define STACKINCRESMENT 10
#define WALL 9999
struct stack
{
int *base;
int *top;
int size;
};

struct mi
{
int val;
bool tag;
int di;
};

void init_stack(stack *);
void push(stack*,int);
int pop(stack*);
int getop(stack*);
int palace(stack*, mi p[10][10]);

int main()
{
int e;
int ch;
struct mi p[10][10];
for(int i=0;i<10;i++)
{
p[0][i].val = 0;
p[i][0].val = 0;
p[9][i].val = 0;
p[i][9].val = 0;
}
for(int j=1;j<9;j++)
{
for(int k=1;k<9;k++)
{
p[j][k].val = 1;
}
}
p[1][3].val = p[1][7].val =0;
p[2][3].val = p[2][7].val =0;
p[3][5].val = p[3][6].val =0;
p[4][2].val = p[4][3].val = p[4][4].val =0;
p[5][4].val = 0;
p[6][2].val = p[6][6].val =0;
p[7][2].val = p[7][3].val = p[7][4].val =0;
p[7][6].val = p[7][7].val =0;
p[8][1].val = 0;

for(int m=0;m<10;m++)
{
for(int n=0;n<10;n++)
{
printf(" %d ",p[m][n]);
p[m][n].tag =0;
p[m][n].di =0;
}
printf("\n");
}

struct stack *s = (stack*)malloc(sizeof(stack));
init_stack(s);
palace(s, p);

printf("\none path is: \n");
for(int a=0;*s->base<89;s->base++)
{
printf("-a");
printf("%d",*s->base);

}

return 0;
}

void init_stack(stack *s)
{
s->base = (int*)malloc(INITSIZE*sizeof(stack));
if(!s->base) printf("malloc error:");
*s->base++ = 0;//栈底为0
s->top = s->base;
s->size = INITSIZE;
}

void push(stack* s, int e)
{
if(s->top - s->base >= INITSIZE)
{
s->base = (int*)realloc(s->base,(s->size+STACKINCRESMENT)*sizeof(stack));
s->top = s->base + s->size;
s->size += STACKINCRESMENT;
}
*s->top++ = e;
}

int pop(stack* s)
{
if(s->top == s->base) printf("error\n");
int e = 0;
e = *--s->top;
*s->top = NULL;
return e;
}

int getop(stack* s)
{
if(s->top == s->base) printf("error\n");
int e = 0;
stack *p = s;
e = *(--p->top);
++p->top;
return e;
}

int palace(stack* s, mi p[10][10])
{
int i=1;
int j=1;
int k;
int r;
push(s,i*10+j);
j++;
do
{
r=getop(s);
if(r==88) return 0;
if(p[i][j].val>0 && p[i][j].di<1)
{
push(s,i*10+j);
p[i][j].tag = 1;
p[i][j].di = 1;
j++;
}
else
{
k = getop(s);
i = k/10;
j = k%10;
if(p[i][j].di==1 && (p[i][j].val>0))
{
p[i][j].di++;
i++;
}
if(p[i][j].di==2 && (p[i][j].val>0))
{
p[i][j].di++;
j--;
if(p[i][j].di>0) { k = pop(s);}
}
}

}while(1);
}

❻ 谁能解释一下回溯算法

回溯算法也叫试探法,它是一种系统地搜索问题的解的方法。回溯算法的基本思想是:从一条路往前走,能进则进,不能进则退回来,换一条路再试。
初识回溯算法是在解决8皇后问题时候,第一步按照顺序放一个皇后,然后第二步符合要求放第2个皇后,如果没有符合位置符合要求,那么就要改变第一个皇后的位置,重新放第2个皇后的位置,直到找到符合条件的位置就可以了
回溯在迷宫搜索中使用很常见,就是这条路走不通,然后返回前一个路口,继续下一条路。

❼ c++迷宫回溯算法问题 为什么一地次执行if(ok!=1) mase[x][y]=0;这条语句后没有返回main函数

你这个是递归算法啊,当它第一次运行完后,肯定是返回上一次递归进来的地方啦

❽ 请问什么是回溯算法

回溯(backtracking)是一种系统地搜索问题解答的方法。为了实现回溯,首先需要为问题定义一个解空间(solution space),这个空间必须至少包含问题的一个解(可能是最优的)。
下一步是组织解空间以便它能被容易地搜索。典型的组织方法是图(迷宫问题)或树(N皇后问题)。
一旦定义了解空间的组织方法,这个空间即可按深度优先的方法从开始节点进行搜索。

回溯方法的步骤如下:
1) 定义一个解空间,它包含问题的解。
2) 用适于搜索的方式组织该空间。
3) 用深度优先法搜索该空间,利用限界函数避免移动到不可能产生解的子空间。
回溯算法的一个有趣的特性是在搜索执行的同时产生解空间。在搜索期间的任何时刻,仅保留从开始节点到当前节点的路径。因此,回溯算法的空间需求为O(从开始节点起最长路径的长度)。这个特性非常重要,因为解空间的大小通常是最长路径长度的指数或阶乘。所以如果要存储全部解空间的话,再多的空间也不够用。

❾ 求走迷宫问题的算法,要求用非递归回溯的方法写

public class MyMaze { private class Point { //自定义数组下标记录类型 int x = 0;
int y = 0; public Point() {
this(0, 0);
} public Point(int x, int y) {
this.x = x;
this.y = y;
} public boolean equals(Point p) {
return (x == p.x) && (y == p.y);
} @Override
public String toString() {
return "(" + x + "," + y + ")";
}
} private int[][] maze = null; //迷宫图
private java.util.Stack<Point> stack = new java.util.Stack<Point>();
//保存路径的栈 public MyMaze(int[][] maze) {
this.maze = maze;
} public void go() {
Point out = new Point(maze.length-1, maze[0].length-1); //出口
Point in = new Point(0,0); //入口
Point curNode = in; //当前点为入口
Point nextNode = null; //下一个访问点(目标点) while(!curNode.equals(out)) {
nextNode = new Point(curNode.x,curNode.y); //设置目标点为当前点,便于下面偏移
if((curNode.x+1)<maze.length&&maze[curNode.x+1][curNode.y]==0) { //如果下方是空的,则目标点向下偏移
nextNode.x++;
} else if((curNode.y+1)<maze[0].length&&maze[curNode.x][curNode.y+1]==0) { //如果右边是空的,则目标点向右偏移
nextNode.y++;
} else if((curNode.x-1)>=0&&maze[curNode.x-1][curNode.y]==0) { //如果上方是空的,则目标点向上偏移
nextNode.x--;
} else if((curNode.y-1)>=0&&maze[curNode.x][curNode.y-1]==0) { //如果左边是空的,则目标点向左偏移
nextNode.y--;
} else { //这里是没有路的状态
maze[curNode.x][curNode.y] = 3; //标记为死路
if(stack.isEmpty()) { //判断栈是否为空
System.out.println("Non solution");
return;
}
curNode = stack.pop(); //弹出上一次的点
continue; //继续循环
} //如果有路的话会执行到这里
stack.push(curNode); //当前点压入栈中
maze[curNode.x][curNode.y] = 2; //标记为已走
curNode = nextNode; //移动当前点
} if(nextNode.equals(out)) {
stack.push(nextNode); //将出口点添加到当前路劲中
maze[nextNode.x][nextNode.y] = 2; //标记为已走
}
System.out.println("\n该迷宫的一条可行路劲为:");
System.out.println("\n"+stack);
} public static void main(String[] args) {
int[][] maze = {
{ 0, 0, 1, 0, 1, 0, 1, 0, 1, 0 },
{ 0, 0, 1, 1, 1, 0, 0, 0, 1, 0 },
{ 0, 1, 0, 0, 1, 0, 0, 0, 0, 1 },
{ 0, 0, 0, 0, 1, 0, 0, 0, 1, 1 },
{ 0, 0, 1, 0, 0, 0, 0, 0, 0, 1 },
{ 1, 0, 1, 0, 1, 0, 0, 1, 0, 0 },
{ 0, 1, 0, 0, 1, 0, 0, 1, 0, 1 },
{ 1, 0, 1, 0, 1, 1, 0, 1, 0, 0 }
};
new MyMaze(maze).go();
}
}

❿ 迷宫回溯

学c的路过,表示看不懂

热点内容
phpc语言 发布:2025-05-17 08:45:30 浏览:805
苹果6s怎么设置4位密码 发布:2025-05-17 08:41:14 浏览:179
如何玩cf端游越南服务器 发布:2025-05-17 08:38:54 浏览:183
噪声的危害和控制设计脚本 发布:2025-05-17 08:22:29 浏览:473
esr算法 发布:2025-05-17 08:16:09 浏览:194
安卓手机怎么用拟我表情 发布:2025-05-17 08:10:13 浏览:918
给U盘安装kalilinux 发布:2025-05-17 08:07:26 浏览:249
sql提示存储过程 发布:2025-05-17 07:35:58 浏览:743
qq里的互动访问 发布:2025-05-17 07:26:53 浏览:665
口语易账号密码发送到哪里 发布:2025-05-17 07:26:52 浏览:62