回溯法 马周游

回溯法 马周游
回溯法 马周游

实验课程:算法分析与设计

实验名称:回溯法的应用

第一部分实验内容

1.实验目标

(1)熟悉使用回溯法求解问题的基本思路。

(2)掌握回溯算法的程序实现方法。

(3)理解回溯算法的特点。

2. 实验任务

(1)从所给定的题目中选择一题,使用回溯法求解之。

(2)用文字来描述你的算法思路,包括解空间、限界函数、算法主要步骤等。(3)在Windows环境下使用C/C++语言编程实现算法。

(4)记录运行结果,包括输入数据,问题解答及运行时间。

(5)分析算法最坏情况下时间复杂度和空间复杂度。

(6)谈谈实验后的感想,包括关于该问题或类似问题的求解算法的建议。3. 实验设备及环境

PC;C/C++等编程语言。

4. 实验主要步骤

(1)根据实验目标,明确实验的具体任务;

(2)设计求解问题的回溯算法,并编写程序实现算法;

(3)设计实验数据并运行程序、记录运行的结果;

(4)分析算法时空性能;

(5)实验后的心得体会。

第二部分问题及算法

1.问题描述

问题1:

在一个8*8的棋盘上,一个放在棋盘上某个位置的马是否可以恰好访问每个方格一次,并且回到起始位置上?

2. 回溯法的一般思路

深度优先搜索,若寻找到满足要求的解,则输出;否则推回上一层往下一个方向搜索。

3. 求解问题的回溯算法描述

对于当前所在位置(x,y),依次枚举8个方向搜索,直到找到一组可行解为止。使用剪枝有3处:第一、使用Warnsdorff's rule,枚举当前解得时候优先选择下一步可行步数最少的方向;第二、若第一点中的方向存在不止一个,则优先选择离中心位置较远的方向;每次都从中心点开始出发,求出一条合法路径后再平移映射回待求路径。

4. 算法实现的关键技巧

在棋盘较大的时候,使用递归会使得函数暴栈,故应当使用非递归方法实现。程序实现时应细心记录清楚当前状态在栈顶。

第三部分实验结果与分析

#include

#include

#include

#include

using namespace std;

const int ix[8] = {1, 2, 2, 1, -1, -2, -2, -1};

const int iy[8] = {2, 1, -1, -2, 2, 1, -1, -2};

int midx, midy;

struct Point {

int x, y, c;

Point(int xx = 0, int yy = 0, int cc = 0):x(xx), y(yy), c(cc) {}

bool operator < (const Point & b) const {

if (c != b.c) return c < b.c;

return abs(x - midx) + abs(y - midy) > abs(b.x - midx) + abs(b.y - midy);

}

};

struct Node {

int x, y;

Node(int xx = 0, int yy = 0):x(xx), y(yy) {}

};

template < class T >

inline void swap(T & a, T & b) {

T t = a; a = b; b = t;

}

int m, n;

bool vis[10][10];

int a[10][10];

inline bool check(int x, int y) {

if (x < 1 || x > n || y < 1 || y > n) return 0;

if (vis[x][y]) return 0;

return 1;

}

bool find(int x, int y) {

for (int i = 0; i < 8; ++i)

if (x + ix[i] == midx && y + iy[i] == midy)

return 1;

return 0;

}

Node ss[10 * 10];

Point b[10 * 10][8], *tb;

int dir[10 * 10], bn[10 * 10], top;

bool dfs(int x, int y) {

int i, j, tbn, nx, ny, mx, my, cnt;

top = 1;

vis[x][y] = 1;

a[x][y] = 0;

ss[top] = Node(x, y);

dir[top] = -1;

while (top) {

if (top == m && find(ss[top].x, ss[top].y)) {

puts("已找到找到一个可行解!");

return 1;

}

if (top == m) {

vis[ ss[top].x ][ ss[top].y ] = 0;

--top;

} else if (dir[top] == -1) {

x = ss[top].x; y = ss[top].y;

tbn = 0;

tb = b[top];

for (i = 0; i < 8; ++i) {

nx = x + ix[i]; ny = y + iy[i];

if (!check(nx, ny)) continue;

cnt = 0;

for (j = 0; j < 8; ++j) {

mx = nx + ix[j]; my = ny + iy[j];

if (check(mx, my)) ++cnt;

}

tb[tbn++] = Point(nx, ny, cnt);

}

if (tbn) {

bn[top] = tbn;

sort(tb, tb + tbn);

tb = b[top];

i = ++dir[top];

vis[ tb[0].x ][ tb[0].y ] = 1;

a[ tb[0].x ][ tb[0].y ] = top;

ss[++top] = Node(tb[0].x, tb[0].y);

dir[top] = -1;

} else {

vis[ ss[top].x ][ ss[top].y ] = 0;

--top;

}

} else if (dir[top] == bn[top] - 1) {

vis[ ss[top].x ][ ss[top].y ] = 0;

--top;

} else {

tb = b[top];

i = ++dir[top];

vis[ tb[i].x ][ tb[i].y ] = 1;

a[ tb[i].x ][ tb[i].y ] = top;

ss[++top] = Node(tb[i].x, tb[i].y);

dir[top] = -1;

}

}

return 0;

}

int main() {

clock_t begin, end;

int i, j, bx, by, k;

while (1) {

printf("请输入骑士初始坐标(1<=x<=8,1<=y<=8):");

scanf("%d %d", &bx, &by);

while (bx < 1 || bx > 8 || by < 1 || by > 8) {

printf("输入不合法!请重新输入骑士初始坐标(1<=x<=8,1<=y<=8):");

scanf("%d %d", &bx, &by);

}

n = 8;

midx = midy = n / 2;

begin = clock();

memset(vis, 0, sizeof(vis));

m = n * n;

dfs(midx, midy);

end = clock();

printf("所用时间:%.0lfms\n", double(end - begin));

if (n <= 20) {

k = m - a[bx][by];

for (i = 1; i <= n; ++i) {

for (j = 1; j <= n; ++j) {

a[i][j] = (a[i][j] + k) % m + 1;

printf("%4d", a[i][j]);

}

puts("");

}

}

puts("");

}

return 0;

}

1.实验数据及结果

2.实验分析及结果

首先先说明上面的数值的意思。上面的数值排成8*8的方阵,每个代表棋盘上的格子,而数字的大小表示骑士走到这个格子的次序,即骑士是第n步走到这个格子的。

从上面是几个实验结果看,程序均能准确地找出一条路径,使得骑士能够遍历整个棋盘,且运行的时间均为0ms。

第四部分心得与展望

1.自我评价及心得体会

该程序本来采用递归函数,后来发现运行很慢,后来在小组同学的讨论下决定不用递归,通过参考不少程序才完成此次实验的,在实验的过程中加深了对回溯法的算法思想的理解。2.展望

对程序进行稍微的修改,使其可以在n*n的棋盘上运行。

马氏文通白话文翻译

马氏文通白话文翻译 马建中 序 古代先人们把发现事物当作自己的事业,于是废弃结绳而创造了书契,然后文字就出现了。根据象形之法造出来的就叫文,形和声相搭配在一起的叫做字,形和声随着时代变化相沿习用,讹传谬误的地方可以说数不尽,上古时期文字不算太多,汉朝接着秦朝大兴文字之学,出现了郑玄,许慎等文字学家。他们进行探究的时候一定要考究最初的书籍,于是小学兴起了。从汉代开始衰退,小学各部分工,各司其职。欧阳永叔说:“《尔雅》产生于汉代,给名物正名,用了大量的文字去说明,于是有了训诂之学。”许慎作说文,于是产生了偏旁之学,篆书和隶书的古文字,形体各不一样,于是产生了字书之学。五声异律、清浊相生,孙炎开始研究字音,于是有了音韵学。吴敬甫把文字研究分为三个部分,一是体制,二是训诂,三十音韵。胡元瑞则说文字学的支端,有十数种观点,有多如形文的,意思的,音韵的,迹象的,考究的,评论的,都要统统删除掉,文字学不外乎训诂,音韵,字书这三种学说而已。这三种学说在清朝已经完备。凡是训诂解释的难处,点画的细腻,音韵的细微处,没有不详细地参考旁证书籍的,探究出最合适的答案,但是各家的得失不同。平凡的人和充满好奇心的人,通常又相互议论,众说纷纭,莫衷一是。于是字形字声在传世的过程中不可能不发生变化,,如今想要用多次变化过后的字形字声区推测原始的字形字声,是非常困难的事情。所以根据已经变化的字形字声来证明那些原始的字的形声,应该追根溯源熟悉最开始的书籍。被证明的是一个字的疑问,一个音的讹传,一笔一画的错误。却不知道祖先在造字的时候,笔画音韵都是千变万化的,给他们字形和读音,原本就没有不变的道理,所以一个字有一个字的写法,一个字有一个字的读音。形声都要一致,经历千百年,其变化也不能太大。所以形和声最容易发生变化,是针对每一个字而言的。而形声变化了,但是也有不变的部分就是针对由字组合成句子来说的。《易经》说“艮其辅,言有序”。《诗经》说“出言有章”。说的有序有章就是说有形有声的字。使用的时候,都非常合适,这样子就能连成文章。《左传》说:“物相杂谓之文”。《释名》说:“汇集众彩以成锦肃,汇集众字以成词宜”。像锦縤一样。如今字形字声最容易发生变化,载文的书籍非常多,让学习者没有适从之感。汇集众字写成文章,所传载的道理没有发生变化了,古今还没有。然后又以易懂的只是教授学习的人,那些只是都到哪里去了?《礼记·学记》说:“每年招收学生,隔一年要考察检验成绩,第一次就要考察标点分段的能力。”《礼记》的注疏说:“离经就是使段落句子通顺。”《通雅》说:“离经辩句,就是让六经通达。”使学习者先要分辨句读。徐邈读作豆,皇甫茂正说:“读书不知道句度,下视服社。度即读”。这就是所谓的句心。但是古人在学习小学的时候必须讲解经理,断绝句读。要断绝句读一定要知道字汇集

马同志现实表现

马同志现实表现 理想信念坚定,政治立场鲜明,具备较高的理论素养和思想水平。该同志认真贯彻邓小平理论和“三个代表”重要思想,深入学习实践科学发展观,坚持党的基本路线、基本方针,在政治上、思想上、行动上自觉同党中央保持高度一致,一丝不苟地落实中央和省、市委的决策部署。认真学习党的十七大和十七届三中、四中、五中全会精神,以及市场经济、财政金融、法律法规、现代科技等知识,思想理论水平较高,知识面宽广。身体力行,带头实践“三个代表”重要思想,坚持“权为民所用,情为民所系,利为民所谋”的政治立场,在原则问题和重大事件上立场坚定,旗帜鲜明,有较强的政治鉴别力和政治敏锐性。 勤奋严谨务实,宗旨意识牢固,具有较强的公仆意识和朴实的亲民作风。该同志工作勤奋务实,严谨细致,准确把握*情和发展实际,为做好决策提供可靠依据;任劳任怨,无私奉献,以**为己任,殚精竭虑,不辞辛劳,千方百计图谋发展,改善民生;群众观念强,密切联系群众,深入体察民情,几乎没有休息过星期天和节假日,深入基层狠抓各项措施的落实,在干部群众中有很高的威信;注重调查研究,化解矛盾,解决热点、难点、焦点问题,为群众为基层办实事;坚持实事求是,真抓实干,注意在工作中鼓实劲、干实事、求实效,有力地促进了****经济和社会各项事业的繁荣发展。平易近人,与民为善,具有较强的亲和力。 工作思路清晰,执政方法科学,具有较突出的统带能力和处理复杂问题能力。该同志思维敏捷,虑事周全;善于听取不同意见,集中集体智慧;善于协调关系,调动每个班子成员的积极性;善于归纳总结高效的工作方法,勇于科学决策,表现出较强的工作能力。一是总揽全局能力较强。工作有魄力,善于抓大事,抓主要矛盾,处理问题迅速果断,有较强的应对复杂局面和解决复杂矛盾的能力。特别是****过程中,该同志面对众多的群众来访和征地矛盾,做了大量深入细致的思想工作,讲清政策,摆明道理,敢于负责,妥善化解群众情绪,保证了项目建设进度.二是领导决策能力突出。工作经验丰富,理论水平高,

三维全景虚拟漫游技术

一、意义 三维全景虚拟漫游技术的核心是通过计算机产生一种如同“身临其境”的具有动态、声 像功能的三维空间环境,而且使操作者能够进入该环境,直接观测和参与该环境中事物的变 化与相互作用。因此,将三维全景虚拟漫游技术应用于航天仿真研究,不但可以使得该领域 内的计算机仿真方法得到完善与发展,而且也将大大提高设计与试验的逼真性、实效性和经 济性,具体表现在如下几个方面: 1.人-机界面具有三维立体感,人融于系统,人机浑然一体。以座舱仪表布局为例,原 则上应把最重要且经常查看的仪表放在仪表板中心区域,次重要的仪表放在中心区域以外的 地方。这样能减少航天员的眼动次数,降低负荷,同时也让其注意力落在重要仪表上。但究 竟哪块仪表放在哪个精确的位置,以及相对距离是否合适,只有通过实验确定。因此利用 R 作 为工具设计出相应具有立体感、逼真性高的排列组合方案,再逐个进行试验,使被试处于其中,仿佛置身于真实的载人航天器座舱仪表板面前,就能达到理想客观的实验效果。 2.继承了现有计算机仿真技术的优点,具有高度的灵活性。因为它仅需通过修改软件中 视景图像有关参数的设置,就可模拟现实世界中物理参数的改变,这样,随着任务的变化, 已有的软件再经修改即可满意新任务的要求,所以十分灵活、方便。 3.突破环境限制。现有航天仿真的计算机系统体现不了空间失重环境,而建立三维全景 虚拟漫游系统,通过虚拟的景象和声响就可以使被试处于太空飞行中实际的载人航天器座舱中,据此展开的相应试验研究具有实际意义。 4.节省研究经费。改用真实的航天器进行相应的试验研究是不可能实现的,因为耗资巨大,经费条件不允许。而采用三维全景虚拟游技术,由于其研制周期较短,设计修改和改型 仅通过软件修改实现,可重复使用,设备损耗低,这样可大大节省经费投入。 二、研究现状 1965年,美国麻省理工学院的科学家设计了一种头盔显示器,通过传感器和计算机仿真 环境的相互作用,可以感觉到自己在几何图形中的移动,产生身临其境的感触感染,由此诞 生了一种新的仿真手段三维全景虚拟游技术。但由于其研制的头盔显示器性能较差,价格昂贵,很长时间内该项技术得不到应用。随着计算机图形学的发展,80年代中期,美国艾姆斯 航天研究中心利用流行的液晶显示电视和其它设备开始研究低成本的三维全景虚拟游系统, 这对于三维全景虚拟漫游技术的软、硬件研制发展推动很大。到了90年代,该项技术受到广 泛关注并向实用迈进。例如美国马歇尔空间飞行中心研制载人航天器的 R座舱,指导座舱布 局设计并训练航天员熟悉航天器的舱内布局、界面和位置关系,演练飞行程序。目前,美国 各大航天中心已广泛地应用 R技术开展相应领域内的研究工作。在 R技术传入我国后,除几 所院校建立一些初步的 R系统模型外,尚无在航天仿真领域展开此项技术的应用研究。 一般而言,三维全景虚拟漫游系统具有两大特点:可以从数据空间向外观察和被试可以 沉醉到数据空间中。它是通过对研究对象的模型进行计算机仿真,由计算机结果去控制虚拟 一

中西方翻译史名词解释

名词解释 1.郭沫若的“风韵译” 在翻译时实现两种文化意识的融合,两种语言的转换和审美风格的再度创造,做到“字句、意义、气韵”三者“不走转”,不走样。其意是说我们不能凭借着自己的主观感觉而赋予翻译文本某种风韵,而应该根据原著的风格来确定译文的风格,译文应该以原著的风格为出发点和归宿。 2.(1)道安的“案本而传,不令有损言游字”何意?(2)“五失本”何意? (1)道安,东晋前秦高僧,佛经翻译评论家,致力于“般若学”,倡“本无”宗,“案本而传,不令有损言游字”:要求要按原本逐字逐句地翻译,不得对原文的字有所增减。他的翻译主张:“究其旨趣,殆归直译矣”。直译派代表人物。 (2)道安的“失本”指的是在译经过程中对原作内容或形式的流失。这“五失本”,反映了译家在“译梵为秦”时,充分认识到两种语言(在语法、修辞、文体以及行文习惯诸多特点上)的差异和思维方式的不同,而所作的变通(三、四、五项皆指译者为求译文简明易了所作的削繁删冗)“失本”,是为了使译文达到符合汉文规范。这是失原作之本,却得译作之本。此乃道安高明之举。“失”正是为了“得”,“以得补失”,这是翻译的辩证法。可以说,“案本而传”是相对的,而“失本”则是绝对的。“不失本”便不成翻译。 3.徐光启的翻译思想 徐光启是我国明末清初“西学东渐”大潮中之先驱, 被称为“西学翻译之父”、“科学译祖”。徐光启的“翻译—会通—超胜”思想有两大特点:一是求知,求真理;二是抓重点,抓“急需”,并能从哲学方法论角度着眼。提出翻译西洋历书须分轻重缓急、循序渐进的见解,并提出了自己的翻译思想:“臣等愚新认为:欲求超胜,必须会通;会通之前,必须翻译。”意思是,只有通过翻译才能“会通”(学习与掌握) ,只有“会通”才能“超胜”(超越与争胜)。与西方传教士利玛窦合作翻译了《几何原本》; 4.方梦志《医学词典》 5.慧远的“厥中论” 慧远主张厥中论,既反对“依实去本,务存其本”也反对“文过其意,理胜其辞”。“厥中”即克服文派质派的缺陷,以达折中。与儒家中庸文化和“中和”美学观有相同之处。 (1)从文体角度,道出翻译困难:以文应质,则疑者众(意译过头而失其真);以质应文,则悦者寡(直译过头而失其美)。主张:“令质文有体,义无所越”(直、意相结合); (2)提出了“质文择中”的中间道路,二者相辅相成。 意义:重新回归孔子“文质之论“,深化了文体学的本体认识; 关注翻译的阅读效果,有一定读者意识; 综合了文派和质派的要义,融合了佛儒学、佛学思想,完成了文质文体上新的认识论循环。 6.玄奘的“五不翻”原则 玄奘论五种不翻:“一秘密故,如陀罗尼直言,咒语。二含多义故,如薄伽,梵具六义尊重,智慧清浅自在,炽盛,端庄,名称,吉祥,尊贵。三此无故,如阎浮树胜金树,中夏实无此木。四顺古故,如阿耨菩提正偏知,非不可翻,而摩腾以来,常存梵音。五生善故,如般若。”玄奘立的“五不翻”原则,对后世的翻译活动,特别是20世纪初掀起的“译名大讨论,”具有重要的指导意义。

回溯法论文-回溯法的分析与应用

沈阳理工大学算法实践与创新论文

摘要 对于计算机科学来说,算法的概念是至关重要的,算法是一系列解决问题的清晰指令,也就是说,能够对一定规范的输入,在有限时间内获得所要求的输出。为了更加的了解算法,本篇论文中,我们先研究一个算法---回溯法。 回溯法是一种常用的重要的基本设计方法。它的基本做法是在可能的范围之内搜索,适于解一些组合数相当大的问题。圆排列描述的是在给定n个大小不等的圆 C1,C2,…,Cn,现要将这n个圆排进一个矩形框中,且要求各圆与矩形框的底边相切。圆排列问题要求从n个圆的所有排列中找出有最小长度的圆排列。图着色问题用数学定义就是给定一个无向图G=(V, E),其中V为顶点集合,E为边集合,图着色问题即为将V分为K个颜色组,每个组形成一个独立集,即其中没有相邻的顶点。其优化版本是希望获得最小的 K值。符号三角形问题要求对于给定的n,计算有多少个不同的符号三角形,使其所含的“+”和“-”的个数相同。 在本篇论文中,我们将运用回溯法来解决着图的着色问题,符号三角形问题,图排列问题,将此三个问题进行深入的探讨。 关键词: 回溯法图的着色问题符号三角形问题图排列问 题

目录 第1章引言 (1) 第2章回溯法的背景 (2) 第3章图的着色问题 (4) 3.1 问题描述 (4) 3.2 四色猜想 (4) 3.3 算法设计 (5) 3.4 源代码 (6) 3.5 运行结果图 (10) 第4章符号三角形问题 (11) 4.1 问题描述 (11) 4.2 算法设计 (11) 4.3 源代码 (12) 4.4 运行结果图 (16) 第5章圆的排列问题 (17) 5.1 问题描述 (17) 5.2 问题分析 (17) 5.3 源代码 (18) 5.4 运行结果图 (22) 结论 (23) 参考文献 (24)

基于krpano 的全景漫游系统的实现

Krpano功能介绍 Krpano的所有标签如下: Crop属性的四个值:0 、0、50、50,表示在加载的图片的0,0位置起,宽50高50裁切出一个图片,供当前使用。也就是说,可以把好几个图标整合在一张图片上,使用时,调用Crop脚本函数,提供要切割的起始坐标,要切割图片的宽高。 parent属性设置插件的父插件名称 Krpano viewer的功能是十分强大和复杂的.本文只介绍系统所用到的几个比较重要的标签=、校园全景漫游的具体实现 2.1、将krpano viewer嵌入html网页 Krpa~o Viewer提供了swfkrpano.is脚本使用它可以很方

便地将krpano viewer嵌入html网页.其使用方法如下: 首先引人脚本文件: