Dennis's profileDennis的共享空间PhotosBlogListsMore Tools Help

Dennis long

Location
滑雪  
Photo 1 of 18

Dennis的共享空间

June 22

要搬家

要搬家了,房子真难找啊
不对 是又便宜条件又好的房子真难找啊
God! Help me,please!
February 28

あなたの怨み、晴らします

私は阎魔爱。あなたが呼んだのよ。

受け取りなさい。

あなたが本当に怨みを晴らしてと思ったら、 その赤い糸を解けばいい。

糸を解けば、私と正式に誓约を交わしたことになる、 怨みの相手は、速やかに地狱に流されるわ。

但し、怨みを晴らしたら、あなた自身にも代偿を払って贳う。

人を呪わば穴二つ。あなたが死んだら、その魂は地狱に落ちる。

极楽は渋滞行けず、あなたの魂は痛みと苦しみを饱きないながら、永远に彷徨うことになるわ。

それでもいいの?
February 24

数学推理

俗话说拳不离手  曲不离口 ,我们程序员也应该时常锻炼一下自己的脑子
下面发几个据说是大多出自微软或其他世界500强企业的面试题
1.元帅领兵

  元帅统领八员将,每将各分八个营,每营里面摆八阵,每阵配置八先锋,每个先锋八旗头,每个旗头有八队,每队分设八个组,每组带领八个兵。请你掐指算一算,元师共有多少兵?

  2.运算符号的妙用

  在1、2、3、4、5、6、7、8、9这一串数字中间,加入运算符号“+”或“-”,使其代数和等于99,按(1 …… 9)可以有17种解,倒过来的后者(9 …… 1)可以有11种解。有兴趣的读者,不妨一试。

  3.两龟赛跑

  有两只乌龟一起赛跑。甲龟到达10米终点线时,乙龟才跑到9米。现在如果让甲龟的起跑线退后1米,这时两龟再同时起跑比赛,问甲、乙两龟是否同时到达终点?

  4.电视机的价格

  麦克因工作繁忙,决定临时请尼克来协助他工作。规定以一年为期限,一年的报酬为600美元与一台电视机。

  可是尼克做了7个月后,因急事必须离开麦克,并要求麦克付给他应得的钱和电视机。由于电视机不能拆散付给他,结果尼克得到了150美元和一台电视机。

  现在请你想一想:这台电视机值多少钱?

  5.这块石头究竟有多重

  有4个小孩看见一块石头正沿着山坡滚下来,便议论开了。

  “我看这块石头有17公斤重,”第一个孩子说。

  “我说它有26公斤,”第二个孩子不同意地说。

  “我看它重21公斤”,第三个孩子说。

  “你们都说得不对,我看它的正确重量是20公斤,”第四个孩子争着说。

  他们四人争得面红耳赤,谁也不服谁。最后他们把石头拿去称了一下,结果谁也没猜准。其中一个人所猜的重量与石头的正确重量相差2公斤,另外两个人所猜的重量与石头的正确重量之差相同。当然,这里所指的差,不考虑正负号,取绝对值。请问这块石头究竟有多重?

  6.三只砝码称东西

  现在有三种不同重量的标准砝码1克、3克、9克。请问可以称出多少不同物品的重量?在进行称量时,要称的东西与已知的标准砝码可以任意地放在天平的两盘之一。另外,每种砝码都只有一只,而且不准复制。

  7.称米

  现有米9公斤以及50克和200克的砝码各一个。问怎样在天平上只称量三次而称出2公斤米?

  8.比萨饼交易

  在我最喜欢的那家比萨饼店中,10寸的比萨卖4.99美元。店主说,他们有一笔12寸比萨饼的交易,定价为每份5.39美元。请问:该店在这笔比萨饼交易中给予了买方多少折扣?

 9.伊沙贝拉时装精品屋

  纽约伊沙贝拉时装精品屋,新近从意大利购进了一件女式冬装。这衣服的购入价格再加二成,是该店标出的销售价。

  出于半个月内未卖出去,女老板又将这个定价减去了一成,很快被一位漂亮小姐买走了

。女老板获利400元。

  请问,这件高档女式冬装购入价是多少?

  10.称量罐头

  为罐头工厂工作的送货员A,给一家食品公司送了10箱菠萝罐头。每个罐头重量是800克,每箱装20个。

  正当他送完了货,要回工厂的时候,接到了从工厂打来的电话,说这10箱中有一箱由于机器出了问题而混进了次品,每个罐头缺50克的分量,要送货员把这箱罐头送回工厂以便更换。但是,怎样从中找出到底哪一箱是次品呢?最需要的当然是秤,可是手边又没有。

  正在这时,他忽然发现不远的路旁有一台自动称量体重的机器,也就是投进去1元硬币就可以称量一次重量。他的口袋里刚好就有一个1元硬币。当然也就只能量一次。那么他应该怎么充分利用这只有一次的机会,来找到那一箱不符合规格的产品呢?

  11.按劳取酬

  有一个农场主,雇用了两个临时工帮忙种小麦。其中一个叫做汤姆,是一个耕地能手,但是他不会播种;而另一个叫做尼克,他并不擅长于耕地,但是,他却是播种的好手。这个农场主决定要种十公顷小麦,让他们各自包一半,于是,汤姆从东头开始耕地,而尼克从西头开始耕地。耕一亩地汤姆只要用二十分钟,而尼克却需要四十分钟,但是尼克播种的速度比汤姆要快三倍。

  他们播种完工后,农场主按照他们的工作量给予他俩一共一百元的工钱。请问:他们应该怎么样分这份工钱才最合理?

  12.四兄弟的年龄

  一家有4个兄弟,他们4个的年龄乘起来的积为14。那么,他们各自的年龄是多大?当然年龄应该是整数。

  13.爱的程度

  在一所乡村学校中,一个刚刚毕业的男数学老师S很幸运地同时得到了两个女教师A、B的青睐。S满脑袋数字,在无法从两者之中选择的情况下,他只好对这两位女教师说,“希望你们用数字或者数学公式,来表示你们对我的爱的程度。”

  A说,“与B比起来,我是一百倍地爱你。”

  B说,“A对你的感情当然没有我对你的感情深。与A相比,我是一千倍地爱你。”

  听了她们深情的话语,不知为什么数学老师S反而神情沮丧地说,“这不就等于说,你们两个都是完全不爱我吗?”

  这究竟是怎么回事?

  14.爬楼梯

  一位先生要到10层楼的第8层去办事,不巧正赶上停电,电梯无法使用,他只能够步行上楼。如果他从第1层爬到第4层需要用48秒,那么请问,以同样的速度走到第8层需要多少秒?

  15.空姐分配物品

  在一架飞机上,中间是一条过道,两边是座位,每一排为三人。两位空姐A和B每人负责一边,对每位旅客分配旅行物品。

  开始的时候,A给右边的旅客发放了6份,此时,B过来对她说,左边应该由A负责。于是A重新到左边开始发放,B接着给右边剩下的旅客发放物品,之后,又帮A发了15份,最后两人同时结束工作。

  请问:A和B谁发的多?多发了多少份?

 ★假设一张圆盘像唱机上的唱盘那样转动。这张盘一半是黑色,一半是白色。假设你有数量不限的一些颜色传感器。要想确定圆盘转动的方向,你需要在它周围摆多少个颜色传感器?它们应该被摆放在什么位置?

  ★假设时钟到了12点。注意时针和分针重叠在一起。在一天之中,时针和分针共重叠多少次?你知道它们重叠时的具体时间吗?

  ★你有两个罐子,分别装着50个红色的玻璃球和50个蓝色的玻璃球。随意拿起一个罐子,然后从里面拿出一个玻璃球。怎样最大程度地增加让自己拿到红球的机会?利用这种方法,拿到红球的几率有多大?

  ★中间只隔一个数字的两个奇数被称为奇数对,比如17和19。证明奇数对之间的数字总能被6整除(假设这两个奇数都大于6)。现在证明没有由三个奇数组成的奇数对。

  ★一个屋子有一个门(门是关闭的)和3盏电灯。屋外有3个开关,分别与这3盏灯相连。你可以随意操纵这些开关,可一旦你将门打开,就不能变换开关了。确定每个开关具体管哪盏灯。

  ★假设你有8个球,其中一个略微重一些,但是找出这个球的惟一方法是将两个球放在天平上对比。最少要称多少次才能找出这个较重的球?

  ★假设你站在镜子前,抬起左手,抬起右手,看看镜中的自己。当你抬起左手时,镜中的自己抬起的似乎是右手。可是当你仰头时,镜中的自己也在仰头,而不是低头。为什么镜子中的影像似乎颠倒了左右,却没有颠倒上下?

  ★ 你有4瓶药。每粒药丸的重量是固定的,不过其中有一瓶药受到了污染,药丸的重量发生了变化,每个药丸增加了一点重量。你怎样一下子测出哪瓶药是遭到污染的呢?

  ★下面玩一个拆字游戏,所有字母的顺序都被打乱。你要判断这个字是什么。假设这个被拆开的字由5个字母组成:

  1. 共有多少种可能的组合方式?

  2. 如果我们知道是哪5个字母,那会怎么样?

  3. 找出一种解决这个问题的方法。

  ★有4个女人要过一座桥。她们都站在桥的某一边,要让她们在17分钟内全部通过这座桥。这时是晚上。她们只有一个手电筒。最多只能让两个人同时过桥。不管是谁过桥,不管是一个人还是两个人,必须要带着手电筒。手电筒必须要传来传去,不能扔过去。每个女人过桥的速度不同,两个人的速度必须以较慢的那个人的速度过桥。

  第一个女人:过桥需要1分钟;

  第二个女人:过桥需要2分钟;

  第三个女人:过桥需要5分钟;

  第四个女人:过桥需要10分钟。

  比如,如果第一个女人与第4个女人首先过桥,等她们过去时,已经过去了10分钟。如果让第4个女人将手电筒送回去,那么等她到达桥的另一端时,总共用去了20分钟,行动也就失败了。怎样让这4个女人在17分钟内过桥?还有别的什么方法?

  ★如果你有一个5夸脱的水桶和一个3夸脱的水桶,如何准确量出4夸脱的水?

  ★你有一袋糖,有红色的,蓝色的,绿色的。闭上眼睛,拿出两块颜色一样的糖,你需要拿多少次才能确保有两块颜色相同的?

  ★如果你有两个桶,一个装的是红色的颜料,另一个装的是蓝色的颜料。你从蓝色颜料桶里舀一杯,倒入红色颜料桶,再从红色颜料桶里舀一杯倒入蓝颜料桶。两个桶中红蓝颜料的比例哪个更高?通过算术的方式来证明这一点。

February 17

新年归来

再不更新一下估计我就像是人间蒸发了太阳
舒舒服服的和爸爸妈妈在家度过了一个新年眨眼
今天坐着普快1482抵达北京,第一次坐这么拥挤的普快悲伤
不过幸好路上遇到一个漂亮的云南姐姐作伴大笑,这回云南出的不仅是美女还是个才女微笑
话题从事业,爱情谈到八卦,笑话,聊起天来也就不觉得时间那么难熬时钟
大半夜没睡,厕所不好上也不敢吃喝太多尴尬
今天到了家后躺下就睡着了困了,明天又开始上班计算机
July 30

人工智能

作者:维基百科   文章来源:维基百科
    近年来,随着计算机技术的迅猛发展和日益广泛的应用,自然地会提出人类智力活动能不能由计算机来实现的问题。几十年来,人们一向把计算机当作是只能以极快地、熟练地、准确地运算数字的机器。但是在当今世界要解决的问题并不完全是数值计算,像语言的理解和翻译、图形和声音的识别、决策管理等都不属于数值计算,特别像医疗诊断要有专门的特有的经验和知识的医师才能作出正确的诊断。这就要求计算机能从“数据处理”扩展到还能“知识处理”的范畴。计算机能力范畴的转化是导至“人工智能”快速发展的重要因素。
人工智能的定义:
    著名的美国斯坦福大学人工智能研究中心尼尔逊教授对人工智能下了这样一个定义:“人工智能是关于知识的学科――怎样表示知识以及怎样获得知识并使用知识的科学。”而另一个美国麻省理工学院的温斯顿教授认为:“人工智能就是研究如何使计算机去做过去只有人才能做的智能工作。”这些说法反映了人工智能学科的基本思想和基本内容。即人工智能是研究人类智能活动的规律,构造具有一定智能的人工系统,研究如何让计算机去完成以往需要人的智力才能胜任的工作,也就是研究如何应用计算机的软硬件来模拟人类某些智能行为的基本理论、方法和技术。
    人工智能(ArtificialIntelligence,简称AI)是计算机学科的一个分支,二十世纪七十年代以来被称为世界三大尖端技术之一(空间技术、能源技术、人工智能)。也被认为是二十一世纪(基因工程、纳米科学、人工智能)三大尖端技术之一。这是因为近三十年来它获得了迅速的发展,在很多学科领域都获得了广泛应用,并取得了丰硕的成果,人工智能已逐步成为一个独立的分支,无论在理论和实践上都已自成一个系统。
    人工智能是研究使计算机来模拟人的某些思维过程和智能行为(如学习、推理、思考、规划等)的学科,主要包括计算机实现智能的原理、制造类似于人脑智能的计算机,使计算机能实现更高层次的应用。人工智能将涉及到计算机科学、心理学、哲学和语言学等学科。可以说几乎是自然科学和社会科学的所有学科,其范围已远远超出了计算机科学的范畴,人工智能与思维科学的关系是实践和理论的关系,人工智能是处于思维科学的技术应用层次,是它的一个应用分支。从思维观点看,人工智能不仅限于逻辑思维,要考虑形象思维、灵感思维才能促进人工智能的突破性的发展,数学常被认为是多种学科的基础科学,数学也进入语言、思维领域,人工智能学科也必须借用数学工具,数学不仅在标准逻辑、模糊数学等范围发挥作用,数学进入人工智能学科,它们将互相促进而更快地发展。
    从实用观点来看,人工智能是一门知识工程学:以知识为对象,研究知识的获取、知识的表示方法和知识的使用。
计算机与智能
    通常我们用计算机,不仅要告诉计算机,要做什么,还必须详细地、正确地告诉计算机怎么做。也就是说,人们要根据任务的要求,以适当的计算机语言,编制针对该任务的应用程序,才能应用计算机完成此项任务。这样实际上是在人完全控制计算机完成的,是谈不上计算机有“智能”。
    大家都知道,世界国际象棋棋王卡斯帕罗夫与美国IBM公司的RS/6000(深蓝)计算机系统于1997年5月11日进行了六局“人机大战”,结果“深蓝”以3.5比2.5的总比分获胜。比赛结束了给人们留下了深刻的思考;下棋要获胜要求选手要有很强的思维能力、记忆能力、丰富的下棋经验,还得及时作出反映,迅速进行有效的处理,否则一着出错满皆输,这显然是个“智能”问题。尽管开发“深蓝”计算机的IBM专家也认为它离智能计算机还相差甚远,但它以高速的并行的计算能力(2r108步/秒棋的计算速度)。实现了人类智力的计算机上的部分模拟。
    从字面上看,“人工智能”就是用人工的方法在计算机上实现人的智能,或者说是人们使计算机具有类似于人的智能。
智能与知识
    在20世纪70年代以后,在许多国家都相继开展了人工智能的研究,由于当时对实现机器智能理解得过于容易和片面,认为只要一些推理的定律加上强大的计算机就能有专家的水平和超人的能力。这样,虽然也获得一定成果,但问题也跟着出现了,例如机器翻译当时人们往往认为只要用一部双向词典及词法知识,就能实现两种语言文字的互译,其实完全不是这么一回事,例如,把英语句子“Timeflieslikeanarrow”(光阴似箭)翻译成日语,然后再译回英语,竟然成为“苍蝇喜欢箭”;当把英语“Thespiritiswillingbutthefleshisweak”(心有余而力不足)译成俄语后,再译回来竟变成“Thewineisgoodbutthemeatisspoiled”(酒是好的但肉已变质)。在其它方面也都遇到这样或者那样的困难。这时,本来对人工智能抱怀疑态度的人提出指责,甚至把人工智能说成是“骗局”、“庸人自扰”,有些国家还削减人工智能的研究经费,一时人工智能的研究进入了低潮。
    然而,人工智能研究的先驱者们没有放弃,而是经过认真的反思、总结经验和教训,认识到人的智能表现在人能学习知识,有了知识,能了解、运用已有的知识。正向思维科学所说“智能的核心是思维,人的一切智慧或智能都来自大脑思维活动,人类的一切知识都是人们思维的产物。”“一个系统之所以有智能是因为它具有可运用的知识。”要让计算机“聪明”起来,首先要解决计算机如何学会一些必要知识,以及如何运用学到的知识问题。只是对一般事物的思维规律进行探索是不可能解决较高层次问题的。人工智能研究的开展应当改变为以知识为中心来进行。
    自从人工智能转向以知识为中心进行研究以来,以专家知识为基础开发的专家系统在许多领域里获得成功,例如:地矿勘探专家系统(PROSPECTOR)拥有15种矿藏知识,能根据岩石标本及地质勘探数据对矿产资源进行估计和预测,能对矿床分布、储藏量、品位、开采价值等进行推断,制定合理的开采方案,成功地找到了超亿美元的钼矿。又如专家系统(MYCIN)能识别51种病菌,正确使用23种抗菌素,可协助医生诊断、治疗细菌感染性血液病,为患者提供最佳处方,成功地处理了数百个病例。它还通过以下的测试:在互相隔离的情况下,用MYCIN系统和九位斯坦福大学医学院医生,分别对十名不清楚感染源的患者进行诊断和处方,由八位专家进行评判,结果是MYCIN和三位医生所开出的处方对症有效;而在是否对其它可能的病原体也有效而且用药又不过量方面,MYCIN则胜过了九位医生。显示出较高的水平。
    专家系统的成功,充分表明知识是智能的基础,人工智能的研究必须以知识为中心来进行。由于知识的表示、利用、获取等的研究都取得较大的进展。因而,人工智能的研究得以解决了许多理论和技术上问题。
人工智能研究的目标
    1950年英国数学家图灵(A.M.Turing,1912—1954)发表了“计算机与智能”的论文中提出著名的“图灵测试”,形象地提出人工智能应该达到的智能标准;图灵在这篇论文中认为“不要问一个机器是否能思维,而是要看它能否通过以下的测试;让人和机器分别位于两个房间,他们只可通话,不能互相看见。通过对话,如果人的一方不能区分对方是人还是机器,那么就可以认为那台机器达到了人类智能的水平。图灵为此特地设计了被称为“图灵梦想”的对话。在这段对话中“询问者”代表人,“智者”代表机器,并且假定他们都读过狄更斯(C.Dickens)的著名小说《匹克威克外传》,对话内容如下:
    询问者:在14行诗的首行是“你如同夏日”,你不觉得“春日”更好吗? 智者:它不合韵。 询问者:“冬日”如何?它可完全合韵的。 智者:它确是合韵,但没有人愿意被比作“冬日”。 询问者:你不是说过匹克威克先生让你想起圣诞节吗? 智者:是的。 询问者:圣诞节是冬天的一个日子,我想匹克威克先生对这个比喻不会介意吧。 智者:我认为您不够严谨,“冬日”指的是一般冬天的日子,而不是某个特别的日子,如圣诞节。 从上面的对话可以看出,能满足这样的要求,要求计算机不仅能模拟而且可以延伸、扩展人的智能,达到甚至超过人类智能的水平,在目前是难以达到的,它是人工智能研究的根本目标。
    人工智能研究的近期目标;是使现有的计算机不仅能做一般的数值计算及非数值信息的数据处理,而且能运用知识处理问题,能模拟人类的部分智能行为。按照这一目标,根据现行的计算机的特点研究实现智能的有关理论、技术和方法,建立相应的智能系统。例如目前研究开发的专家系统,机器翻译系统、模式识别系统、机器学习系统、机器人等。
人工智能的研究领域
    目前,人工智能的研究是与具体领域相结合进行的。基本上有如下领域;
专家系统
    专家系统是依靠人类专家已有的知识建立起来的知识系统,目前专家系统是人工智能研究中开展较早、最活跃、成效最多的领域,广泛应用于医疗诊断、地质勘探、石油化工、军事、文化教育等各方面。它是在特定的领域内具有相应的知识和经验的程序系统,它应用人工智能技术、模拟人类专家解决问题时的思维过程,来求解领域内的各种问题,达到或接近专家的水平。
 
机器学习
    要使计算机具有知识一般有两种方法;一种是由知识工程师将有关的知识归纳、整理,并且表示为计算机可以接受、处理的方式输入计算机。另一种是使计算机本身有获得知识的能力,它可以学习人类已有的知识,并且在实践过程中不总结、完善,这种方式称为机器学习。
    机器学习的研究,主要在以下三个方面进行:一是研究人类学习的机理、人脑思维的过程;和机器学习的方法;以及建立针对具体任务的学习系统。
    机器学习的研究是在信息科学、脑科学、神经心理学、逻辑学、模糊数学等多种学科基础上的。依赖于这些学科而共同发展。目前已经取得很大的进展,但还没有能完全解决问题。
模式识别
    模式识别是研究如何使机器具有感知能力,主要研究视觉模式和听觉模式的识别。如识别物体、地形、图象、字体(如签字)等。在日常生活各方面以及军事上都有广大的用途。近年来迅速发展起来应用模糊数学模式、人工神经网络模式的方法逐渐取代传统的用统计模式和结构模式的识别方法。特别神经网络方法在模式识别中取得较大进展。
理解自然语言
    计算机如能“听懂”人的语言(如汉语、英语等),便可以直接用口语操作计算机,这将给人们带极大的便利。计算机理解自然语言的研究有以下三个目标:一是计算机能正确理解人类的自然语言输入的信息,并能正确答复(或响应)输入的信息。二是计算机对输入的信息能产生相应的摘要,而且复述输入的内容。三是计算机能把输入的自然语言翻译成要求的另一种语言,如将汉语译成英语或将英语译成汉语等。目前,研究计算机进行文字或语言的自动翻译,人们作了大量的尝试,还没有找到最佳的方法,有待于更进一步深入探索。
机器人学
    机器人是一种能模拟人的行为的机械,对它的研究经历了三代的发展过程:
    第一代(程序控制)机器人:这种机器人一般是按以下二种方式“学会”工作的;一种是由设计师预先按工作流程编写好程序存贮在机器人的内部存储器,在程序控制下工作。另一种是被称为“示教—再现”方式,这种方式是在机器人第一次执行任务之前,由技术人员引导机器人操作,机器人将整个操作过程一步一步地记录下来,每一步操作都表示为指令。示教结束后,机器人按指令顺序完成工作(即再现)。如任务或环境有了改变,要重新进行程序设计。这种机器人能尽心尽责的在机床、熔炉、焊机、生产线上工作。日前商品化、实用化的机器人大都属于这一类。这种机器人最大的缺点是它只能刻板地按程序完成工作,环境稍有变化(如加工物品略有倾斜)就会出问题,甚至发生危险,这是由于它没有感觉功能,在日本曾发生过机器人把现场的一个工人抓起来塞到刀具下面的情况。
    第二代(自适应)机器人:这种机器人配备有相应的感觉传感器(如视觉、听觉、触觉传感器等),能取得作业环境、操作对象等简单的信息,并由机器人体内的计算机进行分析、处理,控制机器人的动作。虽然第二代机器人具有一些初级的智能,但还需要技术人员协调工作。目前已经有了一些商品化的产品。
    第三代(智能)机器人:智能机器人具有类似于人的智能,它装备了高灵敏度的传感器,因而具有超过一般人的视觉、听觉、嗅觉、触觉的能力,能对感知的信息进行分析,控制自己的行为,处理环境发生的变化,完成交给的各种复杂、困难的任务。而且有自我学习、归纳、总结、提高已掌握知识的能力。目前研制的智能机器人大都只具有部分的智能,和真正的意义上的智能机器人,还差得很远。
智能决策支持系统
    决策支持系统是属于管理科学的范畴,它与“知识—智能”有着极其密切的关系。在80年代以来专家系统在许多方面取得成功,将人工智能中特别是智能和知识处理技术应用于决策支持系统,扩大了决策支持系统的应用范围,提高了系统解决问题的能力,这就成为智能决策支持系统。
人工神经网络
    人工神经网络是在研究人脑的奥秘中得到启发,试图用大量的处理单元(人工神经元、处理元件、电子元件等)模仿人脑神经系统工程结构和工作机理。
    在人工神经网络中,信息的处理是由神经元之间的相互作用来实现的,知识与信息的存储表现为网络元件互连间分布式的物理联系,网络的学习和识别取决于和神经元连接权值的动态演化过程。
    多年来,人工神经网络的研究取得了较大的进展,成为具有一种独特风格的信息处理学科。当然目前的研究还只是一些简单的人工神经网络模型。要建立起一套完整的理论和技术系统,需要做出更多努力和探讨。然而人工神经网络已经成为人工智能中极其重要的一个研究领域。
    结束语:人类经过五千的发展进入了基于知识的“知识经济”。人类社会空前地高速发展。知识是智能的基础,知识只有转化为智能才能发挥作用,知识无限的积累,智能也就将在人类社会起越来越大的作用,更有人提出:知识经济的进一步发展将是“智能经济”。“智能经济”是基于“广义智能”的经济,“广义智能”包含:人的智能、人工智能以及人和智能机器相结合的“集成智能”。可以想象基于广义智能的“智能经济”将比基于知识的“知识经济”将具有更高的智能水平,更高更快发展速度。 
July 18

Robocode

    Robocode is a game. There is a playfield in which two virtual robots fight against each other. A robot can perform certain actions, like moving around, scanning the environment, shooting and turning the gun. Robocode notified a robot if a significant event occurs, including: scanned the opponent, hit a wall, hit by a bullet or hit the opponent.


download:http://robocode.sourceforge.net/
July 11

delphi学习笔记

   由于客观原因在搞delphi,记录一些资料方便以后察看。
 
listbox从文件中读取列表的操作
ListBox1.Items.LoadFromFile(ExtractFilePath(Application.ExeName)+’aaa.txt’);
ListBox1.Items.Add(Edit1.Text); //添加了一个项目
ListBox1.Items.SaveToFile(ExtractFilePath(Application.ExeName)+’aaa.txt’);
删除项目ListBox1.Items.Delete(listbox1.itemindex);
------------------------------------
判断窗体是否已经打开
if frmPriceInput <> nil then ....
注意:有时窗体虽然已经关闭,但没完全释放,最好在该窗体关闭的CLOSE事件里加入 frmPrintInput = nil;
------------------------------------
关闭MDI子窗口的方法
在子窗口的OnClose事件处理过程中加入如下代码
  Action := caFree;
Delphi为一个Form的关闭行为指定了四种方式,分别是:
caNone -- 禁止Form被关闭
caHide -- Form不被关闭,但是被隐藏。被隐藏的Form仍然可以被程序访问。
caFree -- Form被关闭,并且释放其占用的资源。
caMinimize -- Form被最小化而不是被关闭,这是MDI子窗口的默认关闭行为。
------------------------------------
系统配置文件 *.INI 的操作
头部要引用IniFiles
1、声明变量
IniFile:TiniFile;
2、指明路径
IniFile := TIniFile.Create(ExtractFilePath(Application.ExeName)+’option.ini’);
3、读取变量,注意变量有类型之分readstring,readinteger...等
titleBMPFile:=IniFile.ReadString(’TitleImage’,’FileName’,’’);  //IniFile.ReadString(’组名’,’变量’,’默认值’)
IniFile.ReadInteger
IniFile.ReadBool
4、写入或修改变量
IniFile.WriteString(’标题’,’变量1’,’值’);
5、用完后释放
IniFile.Free;
------------------------------------
动态读取图象
Image1.Picture.LoadFromFile(titleBMPFile);
------------------------------------
fastreport自定义函数的用法
1、先在普通工程窗体上定义好函数
2、在frreport控件的userfunction中写入
    if ansicomparetext( ’My_StrToRMB’ , Name ) = 0 then
   val:=My_StrToRMB(frparser.Calc(p1));
//MY_STRTORMB是函数名
//如果定义多个函数,就多来几个IF即可。
在报表设计视图中就可以调用这个函数了。
------------------------------------
数组是这样定义的sbh:array [0..9999999,0..1]  of string;
------------------------------------
treeview的用法
//先定义项目序数和节点
n: Integer;
Node: TTreeNode;
Node := Tree1.Selected;
if (Node = nil) or (Node.StateIndex = -1) then Exit;//一般可以把不作反应的列的stateindex定为-1
n := Node.StateIndex;
------------------------------------
Fields[]       通过索引返回字段,要自己選擇返回的類型!
FieldByName()  通过名字返回字段,要自己選擇返回的類型!
FieldValues[]  通过名字返回字段的值,自動化類型!  
------------------------------------
调用外部程序方法
用ShellExecute,在USES段加入SHELLAPI,使用时如:
   ShellExecute(handle,’open’,’c:\myapp\myapp.exe’,’-s’,’’,SW_SHOWNORMAL);
   第一个参数为父窗口句柄;
   第二个参数为打开方式(OPEN,PRINT两种);
   第三个参数为执行文件全路径;
   第四个参数为执行文件参数;
   第五个参数为执行文件开始运行时的初始目录;
   第六个参数为为执行文件运行方式(SW_HIDE,SW_MAXIMIZE,SW_MINIMIZE,
SW_RESTORE,SW_SHOW,SW_SHOWDEFAULT,SW_SHOWMAXIMIZED,SW_SHOWMINIMIZED,
SW_SHOWMINNOACTIVE,SW_SHOWNA,SW_SHOWNOACTIVATE,SW_SHOWNORMAL);
------------------------------------
判断文件是否存在
if not fileexists(’db2.mdb.bak’) then ...
------------------------------------
判断按键
if Key=#13 then //如果回车则。。。
------------------------------------
退出
关闭窗口 close;
关闭程序:Application.Terminate;
退出事件 exit;
------------------------------------
检测软件是否已在运行
if GetLastError = ERROR_ALREADY_EXISTS then...
------------------------------------
定义函数是这样写的
function IsReadOnly(b: Boolean; colors: Tcolor): Boolean;
------------------------------------
fastreport直接打印
FrReport1.PrepareReport;     //初始化
FrReport1.PrintPreparedReport(’1’,1,True,frAll);    //打印
预览FrReport1.showreport;
------------------------------------
找开浏览器,进入某站点。(或调用WINDOWS程序)
进入站点ShellExecute(Handle, PChar(’OPEN’), PChar(’http://www.devexpress.com/downloads/index.asp’), nil, nil, SW_SHOWMAXIMIZED);
发送邮件ShellExecute(Handle, ’open’, PChar(’mailto:’ + edtemail.Text + ’?subject=’), nil, nil, SW_SHOW);
------------------------------------
打开文件对话框
if OpenPictureDialog.Execute then

------------------------------------
调用帮助文件
Application.HelpFile := ’..\..\Help\eBars.hlp’;

------------------------------------
打开窗口
TForm1.Create(self).ShowModal;

------------------------------------
取得当前执行程序的路径
FPath := ExtractFilePath(Application.ExeName);

FileName := ExtractFilePath(ParamStr(0)) + ’\MDB\电子通讯录.mdb’;
------------------------------------
当前路径
getcurrentdir

------------------------------------
判断当前鼠标处于某个位置(TAG)
    case TComponent(Sender).Tag of
      0: begin
        ...
          lbBarBackgroud.Caption := sCustomImage;
         end;
      1: begin
        ...
          lbBarBackgroud.Caption := sCustomImage;
         end;
      2: begin
        ...
          lbBarBackgroud.Caption := sCustomImage;
         end;
------------------------------------
数据库连接
1、建立一个adoconnection控件,命名为conn
2、建立一个adodataset控件,命名为ds
然后就可以用以下语句连接并执行SQL查询(本例是access的数据库,带密码)。
conn.ConnectionString:=’Provider=Microsoft.Jet.OLEDB.4.0;Data Source=’+getcurrentdir+’\data\pn.mdb;Persist Security Info=False;jet oledb:database password=80513’;
conn.Connected:=true;
ds.Active:=false;
ds.CommandText:=’select 拜访日期,拜访时间,拜访客户,拜访地点,谈话内容 from khbf order by 拜访日期 desc’;
ds.Active:=true;
------------------------------------
ADODataSet1.State的用法
if ADODataSet1.State in [dsEdit,dsInsert] then
      ADODataSet1.Post ;
------------------------------------
ADOQuery.open和ADOQuery.execSQL的区别
用于存贮时如insert 只能用execSQL
------------------------------------
------------------------------------
------------------------------------
------------------------------------
回车光标移到另一个输入框
if key=#13 then
cmb_name.SetFocus;
------------------------------------
播放声音
playsound(’c:\windows\media\start.wav’,0,SND_ASYNC);
------------------------------------
列表框listbox增加项目
cmb_name.Items.Add(adotable1.FieldValues[’帐号’]);

------------------------------------
listview用法
ListView.Selected := ListView.Items[0];
ListView.Selected.Focused := True;
ListView.Selected.MakeVisible(False);
ListView.Selected.Index
ListView.Items.Count
ListView.Items.Delete(3) //删除第3个项目
ListView.Items.Add.Caption:=’dddddddd’; //增加一个项目
ListView.Items.BeginUpdate;
ListView.Items.EndUpdate
ListView.Canvas.Font.Color := clGrayText;
if ListView.Selected <> nil then。。。。。
//往listview添加项目
先定义
var itm: TListItem;
然后
listview.Items.Clear;
itm := listview.Items.Add;
itm.ImageIndex := 5;
itm.Caption := Msg.Subject;
itm.SubItems.Add(’aaaaa’);
itm.SubItems.Add(’ffffff’);
itm.SubItems.Add(’ffdfdfdf’);
itm.SubItems.Add(’oooo’);
------------------------------------
静态调用DLL的方法
有参数
procedure CreateSms(Text: Pchar);stdcall;External ’SmsLib.dll’;
无参数
procedure CreateSms;stdcall;External ’SmsLib.dll’;
------------------------------------
确定、取消对话框作用
if application.MessageBox(’真的退出?’,’提示’,mb_okcancel)=idok then
application.Terminate;   //Terminate是终止程序
showmessage(’请先选中要修改的班级’);    //这个是简单的显示提示框
messagebox(self.Handle ,’价格输入不合法!’,’提示’,MB_OK or MB_ICONASTERISK);
------------------------------------
调用窗体的步骤
先引用该窗体的单元,然后建立窗体,最后显示出来。
例1:
use uxsgl;
Application.CreateForm(TFmXsgl, FmXsgl);
fmxsgl.ShowModal;
例2:
  Frm_LendDetail:=TFrm_LendDetail.Create(self);
  Try
    Frm_LendDetail.ShowModal;
  Finally
    Frm_LendDetail.Free;
  End;
------------------------------------
数据库查询
先建立数据源,然后添加一个TADOQUERY
adoquery1.SQL.Clear ;
adoquery1.Close;
adoquery1.SQL.Add(’select * from tkcb order by ckcb_kh’);
adoquery1.Open;
aaa=adoquery1.FieldValues[’ckcb_kc’];    //取出当前记录某字段的值
adoquery1.Next;        //下一记录
adoquery1.Close;    //关闭查询
------------------------------------
判断键盘输入字符-chr(13)是回车
 if key=chr(13) then
   bitbtn1.SetFocus;
------------------------------------
时间格式
lblTime.Caption := FormatDateTime(’yyyymmdd hh:nn:ss’,Now);
------------------------------------
表数据的添加添加
dmd是数据模块 tbl_zgdb是表名
  with dmd.tbl_zgdb do begin
    Append;
    FieldValues[’HYZH’] := Edt_HYZH.text;
    FieldValues[’XM’] := Edt_xm.text;
    FieldValues[’XB’] := Edt_xb.text;
    FieldValues[’dw’] := Edt_dw.text;
    FieldValues[’ZZMM’] := zzmm;
    FieldValues[’CSNY’] := trim(Edt_csny.text);
    FieldValues[’GZSJ’] := Edt_gzsj.text;
    FieldValues[’DBLB’] := dblb;
    FieldValues[’ZCLB’] := zclb;
    FieldValues[’XL’] := xl;
    FieldValues[’BZ’] := Edt_bz.text;
    Post;
    close;
  end;
------------------------------------
列表框的选项值
Edit1.Text:=listbox1.Items.Strings[listbox1.itemindex];
------------------------------------
Delphi键盘按键伪码
用法:if key = chr(VK_RETURN) then...
常数名称 十六进制值 十进制值 对应按键
VK_LBUTTON 01 1 鼠标的左键
VK_RBUTTON 02 2 鼠标的右键
VK-CANCEL 03 3 Contol-break 执行
VK_MBUTTON 04 4 鼠标的中键(三按键鼠标)
VK_BACK 08 8 Backspace键
VK_TAB 09 9 Tab键
VK_CLEAR 0C 12 Clear键
VK_RETURN 0D 13 Enter键
VK_SHIFT 10 16 Shift键
VK_CONTROL 11 17 Ctrl键
VK_MENU 12 18 Alt键
VK_PAUSE 13 19 Pause键
VK_CAPITAL 14 20 Caps Lock键
VK_ESCAPE 1B 27 Ese键
VK_SPACE 20 32 Spacebar键
VK_PRIOR 21 33 Page Up键
VK_NEXT 22 34 Page Domw键
VK_END 23 35 End键
VK_HOME 24 36 Home键
VK_LEFT 25 37 LEFT ARROW 键(←)
VK_UP 26 38 UP ARROW键(↑)
VK_RIGHT 27 39 RIGHT ARROW键(→)
VK_DOWN 28 40 DOWN ARROW键(↓)
VK_Select 29 41 Select键
VK_EXECUTE 2B 43 EXECUTE键
VK_SNAPSHOT 2C 44 Print Screen键 
VK_Insert 2D 45 Ins键
VK_Delete 2E 46 Del键
VK_HELP 2F 47 Help键
VK_0 30 48 0键
VK_1 31 49 1键
VK_2 32 50 2键
VK_3 33 51 3键
VK_4 34 52 4键
VK_5 35 53 5键
VK_6 36 54 6键
VK_7 37 55 7键
VK_8 38 56 8键
VK_9 39 57 9键
VK_A 41 65 A键
VK_B 42 66 B键
VK_C 43 67 C键
VK_D 44 68 D键
VK_E 45 69 E键
VK_F 46 70 F键
VK_G 47 71 G键
VK_H 48 72 H键
VK_I 49 73 I键
VK_J 4A 74 J键
VK_K 4B 75 K键
VK_L 4C 76 L键
VK_M 4D 77 M键
VK_N 4E 78 N键
VK_O 4F 79 O键
VK_P 50 80 P键
VK_Q 51 81 Q键
VK_R 52 82 R键
VK_S 53 83 S键
VK_T 54 84 T键
VK_U 55 85 U键
VK_V 56 86 V键
VK_W 57 87 W键
VK_X 58 88 X键
VK_Y 59 89 Y键
VK_BZ 5A 90 Z键
VK_NUMPAD0 60 96 数字键0键
VK_NUMPAD1 61 97 数字键1键
VK_NUMPAD2 62 98 数字键2键
VK_NUMPAD3 63 99 数字键3键
VK_NUMPAD4 64 100 数字键4键
VK_NUMPAD5 65 101 数字键5键
VK_NUMPAD6 66 102 数字键6键
VK_NUMPAD7 67 103 数字键7键
VK_NUMPAD8 68 104 数字键8键
VK_NUMPAD9 69 105 数字键9键
VK_MULTIPLY 6A 106 *键
VK_ADD 6B 107 +键
VK_SEPARATOR 6C 108 Separator键
VK_SUBTRACT 6D 109 -键
VK_DECIMAL 6E 110 .键
VK_DIVIDE 6F 111 键
VK_F1 70 112 F1键
VK_F2 71 113 F2键
VK_F3 72 114 F3键
VK_F4 73 115 F4键
VK_F5 74 116 F5键
VK_F6 75 117 F6键
VK_F7 76 118 F7键
VK_F8 77 119 F8键
VK_F9 78 120 F9键
VK_F10 79 121 F10键
VK_F11 7A 122 F11键
VK_F12 7B 123 F12键
VK_NUMLOCK 90 144 Num Lock 键
VK_SCROLL 91 145 Scroll Lock键
==================
Delphi中怎么将实数取整? 

  floor 和 ceil 是 math unit 里的函数,使用前要先 Uses Math。
  trunc 和 round 是 system unit 里的函数,缺省就可以用。
   floor 直接往小的取,比如 floor(-123.55)=-124,floor(123.55)=123
   trunc 直接切下整数,比如 trunc(-123.55)=-123, floor(123.55)=123
   ceil 直接往大的取,比如 ceil(-123.55)=-123, ceil(123.55)=124
   round 计算四舍五入,比如 round(-123.55)=-124,round(123.55)=124
==================================================
如何把RGB颜色转变成Delphi的 Tcolor?
form1.color:=rgbtocolor(255,0,0); 
函数: 
--------- 
function RGBToColor(R,G,B:Byte): TColor; 
begin 
  Result:=B Shl 16 or 
          G Shl 8  or 
          R; 
end; 
=========================== 
//////////////////////////////////////////////////////////////////////////////// 
回调函数(Callback Routine)的解释 
MyWindowClassInfo = packed record 
Style:UINT 
... 
lpFnWndProc:Pointer 
... 
end; 
应用程序只需要将一个能处理消息的函数地址指定给MyWindowClassInfo中的lpFnWndProc字段,执行环境就知道消息需要调用的函数,于是应用程序可以把任何的函数地址指定给该字段以代表可以处理窗口消息的函数,这个函数是由执行环境来调用的,因此这种函数也被称为回调函数(Callback Routine)。 
回调函数的机制:调用者在初始化一个对象的时候,将一些参数传递给对象,同时将一个调用者可以访问的函数地址传递给该对象,这个函数就是调用者和被调用者之间的一种通知约定,当约定的事件发生时,被调用者就会按照回调函数地址调用该函数。 
///////////////////////////////////////////////////////////////////////////////////////// 
Object Inspector(对象检视器) 
Properties页显示窗体中当前被选择部件的属性信息 
Events页列出了当前部件可以响应的事件 
(小窍门:Object Inspector一直可见,可将鼠标移到Object Inspector上,按动右键,以启动Object Inspector的弹出式菜单,将其设置为Stay On Top。) 
部件的调整与对齐 
如果要精确地表述部件的尺寸,可以在Object Inspector上,改变Left(表示部件左边缘到窗体左边框的象素点数)、Top(表示窗体上边框到部件上边缘的象素点数)、 Width(部件本身的宽度)、Height(部件本身的高度)等属性。 
 
使四个按钮对齐。先将四个按钮选为一组:按住并向右下方拖动鼠标左键,在窗体上画出围绕四个按钮的矩形,释放左键后,被选中的按钮周边会出现暗灰色的边框。选用Edit|Align命令, 
或选中4个按钮,出现灰色边框后,点右键,选择position,后面align…等,是不同方式的对齐,可以调整同样大小的尺寸。 
 
锁定部件 
选择主菜单上的Edit|Lock Controls选项 
设置窗体的缺省按钮 
按钮的Default属性从False改成True,即将它设为窗体的缺省按钮 
 
OnClick事件,即按钮接收到左键单击时应用程序所作出的反应 
 
ColorDialog1.Execute; 
程序的第一句用Execute方法,使得ColorDialog运行它本身 
 
Label(标签)一般放在对象的旁边,用来标记这些对象,当用户使用“Alt+关键字母”时,将自动选中它所指向的对象。方法是设置Label部件的FocusControl属性,在值段中,选用与它关联对象的对象名。  
 
Edit、MaskEdit、Memo部件都是用作接收、显示用户输入文本的。ReadOnly在运行时间内控制对象是否可以进行Windows的操作,当此值为False时,该框内的文本就不能被复制到剪贴板上。MaxLength可以设置输入文本的长度限制。用PasswordChar属性可以按照显示隐蔽密码的方法显示用户输入文本。当一个字段被加上高亮度显示时,按键操作会将这一字段删除,替换成当前的键盘输入。这种设置为操作提供了方便,您不必每次先删除原来的文本;但也可能会导致误删文本。将AutoSelect属性设置成False,这种替代功能就被取消了。 
 
它的EditMask属性为它提供了过滤文本的格式。点动这一属性的省略按钮,会弹出过滤编辑对话框 
 
Memo是备注框,与以上对象不同的是,它可以接收多行文本输入。将ScrollBars设置成ssVertical,可以为它加上一个垂直的滚行条。Align属性调整该对象在窗口中的对齐情况,有alNone(无对齐指定)、alBottom(底部对齐)、alClient(全窗口显示)等可以选择;而Alignment属性则决定了文本在框中的对齐显示格式。Lines属性访问的文本被存储在一个TStrings对象中,按动它的省略按钮,可以通过对话框向它增加文本,也可以用程序对这一属性进行操作,以达到修改或增加备注文本的目的。 
 
Combo Box(组合框) 显示可用磁盘驱动器 
List Box(列表框) Windows打开文件操作时显示文件列表
 
June 01

儿童节的灌水帖

今天是儿童节,当然不会是我的节日
只是以节日之名上来灌水
感慨一下逝去的童年
May 22

老掉牙的算法

LXY曾经在我大三的时候问我一道题
关于跳马的题目,就是在一个n*n的棋盘里随机一点开始
输出一条跳完所有点的路线并且跳过的点不能再跳

当时写的程序老是调不成功就不了了之(唉~ 没有编程的天赋)
后来大四学了算法,同学们都说用递归回溯
网上也有很多现成的算法
 
其事这个问题早在十八世纪初倍受数学家和拼图迷的注意
也被称作骑士走棋盘,它什么时候被提出已不可考
骑士的走法是西洋棋的走法,骑士要如何走完所有的位置?
 
纯粹的递归回溯在维度大时相当没有效率
一个聪明的解法由J.C. Warnsdorff在1823年提出
简单的说,先将最难的位置走完,接下來的路就宽广了
骑士所要走的下一步,「为下一步再选择时,所能走的步数最少的一步。」
使用这个方法,在不使用递归回溯的情況下,可以有较高的几率找出走法(找不到走法的机会也是有的)。
 
演算:
FOR(m = 2; m <= 总步数; m++) [
    测试下一步可以走的八個方向,记录可停留的格个count。
    IF(count == 0) [
       都不可停留,表示无路可走,失败
    ]
    ELSE IF(count == 1) [
       下一步只有一个可能,直接记录这步
    ]
    ELSE [ 
        按照难走的路优先原则选择一条出路
        如果出路值相同,则选第一个遇到的出路。
    ]
    走最少出路的格子,记录跳马的新位置。
  ]
 
下面是实现的程序,可以在java环境下运行:
public class Knight {
 public boolean travel(int startX, int startY, int[][] board) {
  int[] ktmove1 = { -2, -1, 1, 2, 2, 1, -1, -2 };// 跳马走的8步
  int[] ktmove2 = { 1, 2, 2, 1, -1, -2, -2, -1 };  
  int[] nexti = new int[board.length];// 保存下一步出路的位置,最多board.length个
  int[] nextj = new int[board.length];  
  int[] exists = new int[board.length];// 记录board.length个下步的出路个数
  int x = startX;
  int y = startY;
  board[x][y] = 1;
  for (int m = 2; m <= Math.pow(board.length, 2); m++) {
   for (int k = 0; k < board.length; k++) {
    exists[k] = 0;// 初始化全为0 不可走
   }
   int count = 0;// 8方向可走的个数
   for (int k = 0; k < 8; k++) {// 试探八个方向可走性
    int tmpi = x + ktmove1[k];
    int tmpj = y + ktmove2[k];// 如果是出边界了,不可走
    if (tmpi < 0 || tmpj < 0 || tmpi > board.length - 1
      || tmpj > board.length - 1) {
     continue;
    } // 如果这个方向可走,记录下來
    if (board[tmpi][tmpj] == 0) {// 没有被走过,存入下一步的数组
     nexti[count] = tmpi;
     nextj[count] = tmpj;
     count++;// 计数索引加一
    }
   }
   int min = -1;// 记录出路最少的下一步的索引
   if (count == 0) {// 都不可走则返回
    return false;
   } else if (count == 1) {// 只有一个可走,就是第一个
    min = 0;
   } else {// 多个位置可走
    for (int l = 0; l < count; l++) {// 找出下一个位置的出路数,遍历可走的
     // 判断
     for (int k = 0; k < 8; k++) {
      int tmpi = nexti[l] + ktmove1[k];
      int tmpj = nextj[l] + ktmove2[k];
      if (tmpi < 0 || tmpj < 0 || tmpi > board.length - 1
        || tmpj > board.length - 1) {
       continue;
      }
      if (board[tmpi][tmpj] == 0) {// 下步可走则记录
       exists[l]++;
      }
     }
    }
    int tmp = exists[0];
    min = 0;
    for (int l = 1; l < count; l++) {// 从可走的方向中寻找最少出路的方向
     if (exists[l] < tmp) {
      tmp = exists[l];
      min = l;
     }
    }
   }
    x = nexti[min];// 走下一步出路最少的方向
    y = nextj[min];
    board[x][y] = m;
   }
   return true;
 }
 public static void main(String[] args) {
     int[][] board = new int[8][8];
     Knight knight = new Knight();
     if (knight.travel(0, 1, board)) {
         System.out.println("完成!");
     } else {
         System.out.println("无法走完!");
     }
  for (int i = 0; i < board.length; i++) {
     for (int j = 0; j < board[0].length; j++) {
     if (board[i][j] < 10) {
        System.out.print("  " + board[i][j]);
     } else if (board[i][j] < 100) {
         System.out.print(" " + board[i][j]);
     } else {
         System.out.print(board[i][j]);
    }
       System.out.print(" ");
   }
   System.out.println();
  }
 }
}
 
 
执行结果:
完成!
  4    1    6  21  28  43  16  19 
  7  22   3  44  17  20  29  42 
  2    5  24  27  48  41  18  15
 23   8  45  40  25  56  47  30
 52  39  26  61  46  49  14  57
  9  64  53  50  55  60  31  34
 38  51  62  11  36  33  58  13
 63  10  37  54  59  12  35  32
 
资源