谢维康突然一拍桌子,喝道:“有了!”
这一嗓子把小哥惊得一个激灵,他忍不住骂道:“别一惊一乍的,吓我一大跳!快说,你想到什么办法了?”
谢维康指着屏幕上的迷宫,说道:“你仔细看,你这些迷宫,周围是不是都围着一圈墙?”
小哥紧盯着屏幕,目光跟着谢维康的手指移动,顺着他的话细细思索。
谢维康的手在屏幕上滑动,继续分析道:“你看,这圈墙后面是路,路后面又是墙。也就是说,在这个二维平面里,垂直方向第一列是墙、第二列是路、第三列是墙、第四列是路,以此类推,奇数列是墙,偶数列是路。水平方向也是一样,没错吧?”
小哥领会过来,轻轻点了点头。
“而且你的起点和终点,都开在这最外圈的墙上,中间的路也连通着墙。”谢维康接着说道,“我有个想法,你听听行不行?”
见谢维康停了下来,还直盯着自己,小哥急道:“你快说啊,别卖关子了,我都快愁死了!”
谢维康解释道:“首先,这些地图的宽度和高度必须是奇数行、奇数列。你先生成一圈墙,再定好入口和出口,接着从入口开始生成路。用0、1、2、3四个数字表示前进方向,每次往前走两步就生成一个节点,做好标记,再用随机数确定下一步方向。这样一来,这些节点就是迷宫里的路。要是当前方向的下一个节点已经有标记,说明这条路走不通,得转弯;要是前进方向的前、左、右三个方向都有标记,那就是死路。之后你扫描整个地图数据,找到未标记的节点,这个节点周围四个节点里,肯定有一个是已标记的。从这个已标记节点开始,往未标记节点继续重复上面的流程,直到扫描完整个地图、找不到未标记节点为止。这些连在一起的节点就是迷宫的路,剩下的就都是墙。最后根据这些数据把迷宫画出来就行。”
小哥的眉头皱得更紧,显然还没完全听明白。
谢维康见状,到吧台借了纸笔,在纸上随便画了个小迷宫,一边在里面画线,一边接着解释。
最后他总结道:“我的意思是,你别管墙不墙的,就当地图上有隐形的墙,奇数行列上的点全是墙。你要做的,就是模拟从入口到出口的过程,遍历整个地图,能穿透这些隐形的墙,找出所有能走的路。既然所有能走的路都找到了,剩下的不就全是墙了吗?”
这番解释让小哥豁然开朗,他一边点头一边重复并总结谢维康说的方法:“哦,我懂了!你是说从入口开始找路,遇到死路就回头换条路,一直找,直到把全地图的路都找出来,对不对?”
谢维康松了口气,总算能顺着这个话茬往下说。
可小哥又冒出新问题:“那怎么确保这条路能和出口连上呢?”
“首先,你设置入口和出口时,它们的行号或列号必须是偶数。”谢维康解释道,“这样一来,入口和出口肯定能和路的节点连上,两者之间至少会有一条通路。至于会不会有第二条通路,我就不确定了,毕竟我没写过这么复杂的逻辑。”
说到这儿,他故作深沉地纠正道:“哦对了,我刚才有个地方说错了。C语言的数组下标是从0开始的,所以奇数行列对应的数组下标其实是偶数。”
小哥当即给谢维康竖了个大拇指:“嚯,原来可以通过搜索路来确定迷宫数据呐?我之前一直死磕迷宫的墙,你说,我怎么就没想到这个方法呢?刚刚听你这么一分析,我现在是茅塞顿开!”
话音刚落,他就不管谢维康,自己埋头忙活起来。
谢维康看了看时间,已经不早了,他点开QQ,李梅还是没回复消息。
虽说他一直告诉自己,已经把对李梅的感情压在心底,可此刻还是忍不住露出一丝失落。
他利索地收拾好物品,关掉电脑,跟小哥道别后,离开网吧回了家。
……
翌日下午收工后,谢维康又去了网吧,刚在电脑上开始下载安装VC++6.0,就有人从后面拍了拍他的肩膀。
他转头一看,正是昨晚遇到的那个小哥。
小哥拍着他的肩膀,笑容灿烂地夸道:“兄弟,你可真有两下子!昨天你走后,我按你说的方法写了段代码,居然真成了,我给你看看……”
说着,小哥打开谢维康右边的电脑,往主机上插了个小东西,接着在“我的电脑”里点开一个文件夹,没一会儿就把VC++6.0装好了。
谢维康疑惑地问:“你插在电脑上的这是什么?怎么没见你下载,VC++6.0就装上了?”
小哥一边摆弄电脑,一边回答说:“哦,你说这个啊,这是U盘,用来存数据的。”
谢维康觉得这东西不错,又追问道:“多少钱一个?”
“我这个是128MB的,花288元买的。”小哥解释说。
谢维康惊呼道:“啥?288元?这么贵?”
小哥看了他一眼,继续说道:“我买得早,现在256MB的差不多也就这个价。”
小主,这个章节后面还有哦,请点击下一页继续阅读,后面更精彩!