作者ledia (下班後才下棋)
看板C_and_CPP
标题Re: [问题] 请问一下我的八皇后程式
时间Sun Dec 13 23:14:42 2009
※ 引述《pocernld (时间像流水般过去了...)》之铭言:
: 遇到的问题: (题意请描述清楚)
: 我写了一个八皇后程式,但是编译以後执行却完全没东西,
: 可否请板上各位高手帮我看一下,谢谢
: 希望得到的正确结果:
: 八皇后的解
: 程式跑出来的错误结果:
: 完全不会动...
: 开发平台:
: Dev-c++ 4.9.9.2
: 有问题的code: (请善用置底文标色功能)
code 麻烦下次用置底的那几个贴 code 网页贴
贴在 BBS 上阅读不便
真的有人想 copy 下来帮忙看问题在哪里, 也会很麻烦
: 补充说明:
: 说一下我的想法
: 1.假设皇后放在一个格子之中,则他可以吃到的格子数目全部加起来
: 写在那一个格子里头,然後去求所有格子的最小值,把皇后放在那个最小值里面
: 然後把它可以吃掉的格子设为1,再去求剩下不能吃掉的格子的最小值,
: 然後再放第二个皇后,以此类推下去,放皇后的方法就是那些是最小值的格子
: 一个一个去试,如果走到死路的话,就把最後一次放皇后的格子的格子的皇后拿掉
: ,重新设定最小值,再把皇后放在下一个格子,一直到找到解为止
你是第一个在版上贴出自己的 code 之後
我想了两天才知道要跟你讲什麽的人... orz
即使有很多人小小揶揄了一下
不过我觉得还是需要认真评论一下这件事
首先, 看起来你是个新手
对新手而言, 我对你的做法/想法很赞赏
虽然你的做法是很基本的 greedy search
但这种方法在我还是新手时
是无法找出完备的构想并且实作出来
写程式其实可以非常粗略的分成两个部份
第一个是想出好的步骤或解法 (或称演算法)
第二个则是依照你想好的解法去写出对应的程式码
通常上面两个的能力是可以分开训练的
第一个需要的是逻辑推理和数学能力
第二个则是一开始需要一些基本入门的学习
接着就是大量的实作经验和阅读它人的程式
甚至是看书来增进程式写作技巧
当你的实作能力还不够成熟的时候
就会发现有些很简单的概念或想法
你都只能写出自己都很难以理解的程式
就好像如果一个人英文的辞汇背的不是很多
他就得要比手划脚才能说出他想表达的意思
基本上你所遇到的问题就是这样了
但别紧张, 每个人都会经历过这一段
大部份人看到这程式会笑, 多半也都是会心一笑
总之, 你需要按部就班的练习
可能的话找个比较有经验的人帮你忙
在你有想法, 要开始实作之前讨论一下
我相信经验多了, 慢慢就会得心应手了
至於 8queen 的问题
你的方法不错, 但是你可以进一步想一想
虽然每次挑吃掉最少格子的 queen 来放
等之後所有摆法都不行之後才去试次少的
但如果运气不好, 某一组解是需要放在吃掉最多格的那格
你还是得试过所有可以放的位置
既然如此, 我们其实可以不管次序
只要试过所有可以放的位置就好
(就是去试所有不会跟之前放过的 queen 打架的位置)
是不是会把问题又简化了许多 ?
你可以试试看这种比较简化的解法能不能实作的出来
其实十六层回圈的解法并没有对错问题
只是你自己应该有感觉到
找哪里写错会找得非常痛苦
而且如果题目改成找 10 queen 问题
你的程式又需要大改版
所以一般来说我们会用一些技巧来避免这种写法
这也是往後继续进步所需要努力的方向
一个程式能够写得越简单越容易懂越好
最好就是随便一个入门者来看都不会太费力就能看得懂
这样未来如果有机会写大系统时要合作也会比较轻松
: 麻烦各位大大解答了
: 小弟我已经熬夜两天debug不出来...
: 感激不尽...
最後说一下, 8 queen 已经算稍稍进阶的题目了
很多大学、硕士毕业的人都不见得能一次写到好
但我不知道你目前学习到哪
所以也不知道给什麽样的提示对你比较有帮助
通常解 8 queen (或 N queen) 用的方法基本是 DFS
如果你还有兴趣的话可以 google "8 queen" 或是 "depth-first search" 看点资料吧
--
有时候,遗忘,是令人快乐的。什麽时候?当然是有人伤了你的心的时候。
存心伤你的那个人,固然是故意和你过不去,但是被伤了心而耿耿於怀的你
,却是和自己过不去了。所以,记性不好的人,通常会是比较快乐的人,也
是比较不容易被击倒的人。
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 140.112.30.50
※ 编辑: ledia 来自: 140.112.30.50 (12/13 23:19)
※ 编辑: ledia 来自: 140.112.30.50 (12/13 23:22)
1F:推 saxontai:ledia大真的很佛心,一定要推一下! 12/13 23:26
2F:推 VictorTom:推一下l大, 说得真好:) 12/13 23:36
3F:→ dendrobium:好佛 12/13 23:39
4F:推 walker2009:great 12/13 23:40
5F:推 pocernld:推 感谢大大指教 我再试试看... 12/14 00:37
6F:推 siriusu:推l大 12/14 04:38
7F:推 wa120:推 不过如果code很杂乱可是效率是很高的话 也有可能要牺牲.. 12/14 11:20
8F:→ ledia:给楼上, 如果你这辈子真的会遇过这种情形, 那你已经是大师了 12/14 12:18
9F:→ ledia:大部份情况, 即使在最佳化之後, 都是能够写得很好读的 12/14 12:19
10F:→ ledia:一定得写得很难看懂的, 不容易遇到, 现在编译器都这麽强了 12/14 12:19
11F:→ ledia:更何况, 软体开发上遇到的问题, 也是可以用硬体来解决 12/14 12:20
12F:→ ledia:比如说让多台机器来一起算... 我认为可读性重要得多就是了:) 12/14 12:21
13F:→ Cloud:推热心~~ 12/14 18:44
14F:推 shik:推~ 12/14 18:53
15F:→ ktta:可读性是很重要的东西 不然时日一久 东西就会变回废物 12/14 23:29
16F:推 eisenccw:超热心 12/15 04:28
17F:推 jpeanut:推~ 12/15 04:55
18F:推 simon8233:当初我也跟原PO写了一样的程式... 12/15 21:49
20F:→ simon8233:现在还是没进步..这代表我需要补..很多的演算法.. 12/15 21:50
21F:推 SamWaa:写的真好!!! 我就是用十六层回圈..超痛苦...真的.. 12/16 13:10