作者game0416 (凤狼)
看板NTUE-CS102
标题Re: [闲聊] 程设作业
时间Mon Oct 25 15:43:55 2010
资结第一项程设作业...
讲起来可能也是不知道还有什麽好讲作法的,某个角度上王老大都讲完了
试着用不同方式
去解析题目该怎麽作...吧(?)
然後我要先声明,讲是讲要问谁想装死
不过我没提过我自己不交这件事Q
写不出来的人数多的话,向後延不是很意外的发展hmmm
--
虽然只要有人问起我就不太确定要作多大的
不过10*10跟20*20大概只差阵列宣告大小的差别,不要太担心(?)
所以..因为我想多少都有个概念了,至少知道题目要干嘛
这样的话,请先忘记三小堆叠的事情,这种话出现在题目里面只是混淆视听而已
记得作程设应该比较像是「找出方法」而不是「套用方法」
﹕ 讲这种话让我自己都想吐嘈自己数学也该这样学(死在地上)
而在多数情况之下,暴力法在人脑思考下都是最直观的作法
以走迷宫来说,暴力法就会是"走过每一种路线、经过每一个点"
这个才是现在我们作走迷宫的想法,跟那什麽堆叠都还扯不上关系
然後为了作到这个方法,我们就去规划"怎麽作"
也就是再来王老大在上课的说明内容.....
下页我试着用不同的方去讲这件事
--
首先,要想"如何能确保会走每一种路线"
这件事可以从排列组合来看...
如果没有公式,排 1 2 3 4有几种排法,我们就会照顺序逐个排
首先是照顺序
1 2 3 4
再来调整最後一项发现不能改,所以退而求其次,调倒数第二项
1 2 4 3
然後倒数第二项再来也不能动,就改倒数第三项...
1 3....2 4
发现排完倒数第三项,再来 2 4 会有两种,就照顺序 1 3 2 4先
1 3 4 2 後
1 4 2 3
1 4 3 2
...略
...略
4 3 2 1
用同样的逻辑来看地图上的点....嗯,这样说明不太容易理解
取前两天的测资作说明
--
先拿上次写出来当测资的图作代表
最上面一列、最左边一行作为索引
就当地图座标就好
0 1 2 3 4 5 6 7 8 9
0 0 1 1 1 1 1 1 1 1 1 这是张稍微小小复杂了点的地图
1 1 0 1 1 1 1 1 1 1 1 当然,我们的起/终点是0,0 9,9
2 1 1 0 1 0 0 0 0 0 0
3 1 0 1 1 1 1 1 1 1 0 方法是上课提的顺时针法检测...
4 0 1 1 0 0 1 1 1 0 1
5 0 1 0 1 1 1 1 1 1 0
6 0 0 1 1 1 1 1 1 1 0
7 1 0 1 0 0 0 0 1 1 0 另外一张一本道(?)地图在写现在讲解
8 1 0 0 1 1 1 1 0 0 1 这段之前,用作测试程式会不会正确移动的
9 1 1 1 1 1 1 1 1 1 0
单凭简单的肉眼走,我想是能直观写出路线
不过电脑很笨,照着我们的判断法会走很多路
再来我直接写出来电脑走的路径,这样应该会比讲一堆ㄆ话来得快
--
→为x
↓为y,取绝对值...或说是座标转换也好_A_
反正参考图旁边索引就是了
(0,0) -> (1,1) -> (2,2) -> (1,3) -> (0,4) -> (0,5) ->
(1,6) ->
(2,5) -> (3,5) -> (2,5) ->
(1,6) -> (1,7) -> (2,8) -> (3,7) ->
(4,7) -> (5,7) -> (6,7) -> (7,8) ->
(8,8) -> (9,7) -> (9,6) ->
(9,5) -> (8,4) -> (9,3) -> (9,2) -> (8,2) -> (7,2) -> (6,2) ->
(5,2) -> (4,3) -> (4,2) -> (4,3) -> (5,2) -> (6,2) -> (7,2) ->
(8,2) -> (9,2) -> (9,3) -> (8,4) -> (9,5) -> (9,6) -> (9,7) ->
(8,8) -> (9,9)
徒手写,程式放在家里懒得当场刻出来只为了写教学
所以可能哪边有小错误...应该是没有啦(?)
大概注意一下红字点上的走路方向与走回红字这两件事
第一次进入(1,6),顺时钟方向先看到(2,5)是活路,所以就往那边过去了
走到(3,5)发现死路,这里记得此时的(2,5)应该在地图上已经标记成是死路
就回头走回(2,5),也发现已经找不到方向,所以再退回(1,6)
(1,6)再一次的看看哪里还是活路,找到(1,7),於是继续运行...(8,8)同理
--
比较特别的,在做移动的时候,只要是自己走过的地方就当成是死路
因为照我们的组合方法、顺时钟检查、移动方向
一定会慢慢检查过现在所在路径之上/右上方每一个点所能延伸出来的走法
也就是说,我们的检测路线方法,可以说成
从地图上方找出一条最能沿着边缘移动的路线,然後沿着该路径最末端开始扫描
这样好像还算动态规划(DP)…不断由两个最接近且没有走过的点作为单元
开始组成整张地图的所有路径
这样讲起来又变复杂了...
直接把第一次/第二次走到(1,6)在电脑"认知"上的地图画出来比较快
--
第一次走到(1,6)
0 1 2 3 4 5 6 7 8 9
0 1 1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1 1 1
2 1 1 1 1 0 0 0 0 0 0
3 1 1 1 1 1 1 1 1 1 0
4 1 1 1 0 0 1 1 1 0 1
5 1 1 0 1 1 1 1 1 1 0
6 0 1 1 1 1 1 1 1 1 0
7 1 0 1 0 0 0 0 1 1 0
8 1 0 0 1 1 1 1 0 0 1
9 1 1 1 1 1 1 1 1 1 0
--
走到(3,4)时
0 1 2 3 4 5 6 7 8 9
0 1 1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1 1 1
2 1 1 1 1 0 0 0 0 0 0
3 1 1 1 1 1 1 1 1 1 0
4 1 1 1 1 0 1 1 1 0 1
5 1 1 1 1 1 1 1 1 1 0
6 0 1 1 1 1 1 1 1 1 0
7 1 0 1 0 0 0 0 1 1 0
8 1 0 0 1 1 1 1 0 0 1
9 1 1 1 1 1 1 1 1 1 0
--
第二次走到(1,6)
0 1 2 3 4 5 6 7 8 9
0 1 1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1 1 1
2 1 1 1 1 0 0 0 0 0 0
3 1 1 1 1 1 1 1 1 1 0
4 1 1 1 1 1 1 1 1 0 1
5 1 1 1 1 1 1 1 1 1 0
6 0 1 1 1 1 1 1 1 1 0
7 1 0 1 0 0 0 0 1 1 0
8 1 0 0 1 1 1 1 0 0 1
9 1 1 1 1 1 1 1 1 1 0
--
大概像是这样...吧
虽然我不知道这样解释会不会比王老大来得容易理解一点点
比起从第一格开始往外踏出第一步这件事
在这题目可能更要想清楚在某条路径最末端开始往回每一步後的下一步
该说每走上一个点都像是起点这样的想法吗(?)
--
违背命运是人之常情。
人们从在犯了错之後,才向神明祈祷以求补偿。
狼与辛香料 克拉福‧罗伦斯
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 220.130.128.171
※ 编辑: game0416 来自: 220.130.128.171 (10/25 15:53)
1F:→ game0416:附上code就会直接抄下去了...行数理论上不会太多 10/25 15:54
※ 编辑: game0416 来自: 220.130.128.171 (10/25 15:58)
2F:推 j2612280:科科 10/25 16:58
3F:→ game0416:楼上笑什麽qq 10/25 17:18
4F:推 gentlefaith:凤郎用心推!! 10/25 17:36
5F:推 johlmike:努力中QQ~教学文推 10/26 00:31
※ 编辑: game0416 来自: 119.14.27.224 (10/31 20:41)
※ 编辑: game0416 来自: 119.14.27.224 (10/31 20:42)