文章分类 | 推荐文章 | 最新文章 | 热点文章 | 最新软件 | 精品软件 | 下载排行 | 推荐下载 | 免费看大片 | WPS | 杀毒软件
清风网络
首 页 软件下载 网络学院 数码学院
QQ 电脑入门 游戏 操作系统 图形处理 办公软件 媒体动画 精文荟萃 工具软件 网络编程 程序开发 网络技术 认证考试 网站建设 文章专栏
当前位置:清风网络学院程序开发数据结构一道Google中国挑战赛竞赛题的解法
精品推荐
特别推荐
·网游外挂编写完全攻略
·开发WDM型的USB设备驱动程序
·数据库设计范式深入浅出
·理解软件保护技术之序列号方式
·大型网站必鉴:分销渠道的结构
·你的代码真的很健壮吗
·利用HOOK拦截封包原理
·四种网络游戏外挂的设计方法
·程序语言效率比较
·五子棋算法
·正则表达式从入门到精通
·SQL Server不能启动的常见故障
·Windows应用程序设计的基本术语
·软件本地化与汉化
·Windows中断编程
·windows nt 4.0中文版的开机过程
热点TOP10
·网游外挂编写完全攻略
·兵之利器 软件开发辅助工具纵览
·开发WDM型的USB设备驱动程序
·DCOM揭秘之六
·VS2008 第一次安装心得及使用
·游戏外挂设计技术探讨
·《数据结构》试题下载2004
·饺子馆的物流故事之二——供应链视角下的缺货及品类管理
·代码静态分析工具PC-LINT安装配置
·使用BHO定制你的IE浏览器
·原始套接字透析之Raw Socket基础
·基于CS模式的Winsock网络通讯程序
·程序语言效率比较
·《Windows程序设计》读书笔记之六
·四种网络游戏外挂的设计方法
·用CVSNT与WINCVS实现CVS的架设
·利用HOOK拦截封包原理
·简单对象访问协议(SOAP)初级指南
·带你全面了解数据库应用系统的开发步骤
·UML业务建模实例分析

一道Google中国挑战赛竞赛题的解法

日期:2007年5月3日 作者: 查看:[大字体 中字体 小字体]


  在find每个字符的相应位置向量中,并非每个位置都是有效的(例如例1中,字符A在grid中在两个位置出现,但仅有一个位置可以作为起点),所以我们需要判定两位置是否可以彼此移动得到的算法。通过观察两个可以彼此通过向上,向下,向左,向右,以及对角线移动一格移动到达的坐标的特点,我发现符合条件的两个点的位置纵横坐标的差还是有规律的:向上移动的差值为(0,1),向下(0,-1),向左(1,0),向右(-1,0),左上角对角线(1,1),右上角对角线(-1,1),左下角对角线(1,-1),右下角对角线(-1,-1)。归纳这8种情况可以得到这么个结论:两位置纵坐标横坐标差值的绝对值中,有一个必须是1,另一个必须小余2(即0,1两个值),假设两位置纵坐标横坐标差值的绝对值分别是xAbs,yAbs,则( xAbs == 1 && yAbs < 2 ) ( yAbs == 1 && xAbs < 2 )(显然 这种判定的方法可以排除在相同位置停留两次的情况,此时xAbs和yAbs的值都为0)。 若以用例1为例,其grid中的点E的坐标为(1,1),左上角A的坐标为(0,0),则xAbs = 1-0 = 1, yAbs=1-0=1,符合判定条件,所以E点可以移动到这个A点。而另一个A点坐标为(1,2)则xAbs=0,yAbs=1,符合判定条件,所以E点也可以移动到这个A点。

  2.2 判定算法的框架

  接下去我们需要将当前位置向量中的每一个值与前一个位置向量中的每一个值逐个比较判定。假定现在判定find中位置为第i个字符与前一个位置向量中点的关系,我们可以这么做:保存find第i字符在grid中位置的向量为vec[i],保存在vec[i]中其第j个位置坐标可以用vec[i][j]取得;由于需要和前一个位置向量(vec[i-1])比较,显然i从1开始,且i< find字符串长度。遍历从位置1开始的位置向量中的所有位置坐标的代码如下:

for ( i = 1; i < findStrLen ; i ++)
{
 for ( j=0; j < vec[i].size(); j++)
 {
  POS cur = vec[i][j];
  .....计算cur 与前个向量vec[i-1]的结果的代码
 }
}
  我添加了一个临时变量VETPOS midVes来保存当前位置向量中符合条件点坐标值。当遍历当前位置中的所有点后,将当前位置向量清空,然后将符合条件并保存在midVes中的位置保存回当前向量中去。如果midVes为空则表示前一个位置向量中的点没有一个可以移动到当前位置向量中的点的位置上去,显然路径已断路,应该马上返回 0。结合前面的代码,得到如下代码: VETPOS midVes;//保存当前位置向量中符合条件点的临时向量

// 遍历从位置1开始的位置向量
for ( i = 1; i < findStrLen ; i ++)
{
 midVes.clear();

 //遍历当前位置向量中的所有位置坐标
 for ( j=0; j < vec[i].size(); j++)
 {
  POS cur = vec[i][j];

  //如果当前点与前个向量vec[i-1]中的点可以移动到达,则保存这个点到临时变量midVes中去
  if ( pathCount(cur,vec[i-1]))
  {
   midVes.push_back(cur);
  }
 }

 //清空原来的向量
 vec[i].clear();

 //如果midVes中有符合条件的点存在,则将它保存到原来的位置向量中去
 //否则返回0
 if ( midVes.size() >0 )
 {
  vec[i] = midVes;
 }
 else
 {
  return 0;
 }
}
  代码中的 pathCount(cur,vec[i-1]) 用来计算cur点与前一个位置向量vec[i-1]的中的点存在可能的路径数,如果返回0则表示点cur无法按照题意移动到保存在前一个位置向量vec[i-1]中的任何一点。pathCount的实现将在下文描述。

  2.3 统计每个位置向量中每个位置的当前符合要求的路径数

  如果将所有的符合find字符串的路径全部找到,然后再统计总数的话,就需要多次遍历vec向量。由于题目并没要求我们将符合的路径输出,所以完全可以在寻找路径的同时,也开始统计每个位置向量中每个位置的当前符合要求的路径数。出于此目的,我在POS结构体中增加了int count;这个字段。如例1中,find的第2个字符B,从第一个字符A移动到B的路径只有一条,所以假设POS b,表示这个位置的B点坐标,则ps.x=1,ps.y=0,ps.count=1。显然每个位置坐标的count值,应该为前一个位置向量中的所有可以移动到这个点的count值的和。而第一个位置向量中的每个坐标的count值等于1。即保存在vec[0]中的每个位置坐标的count值设置为1。 我增加了一个函数来处理一个点与保存在前一个位置向量中的每个点是否可以移动得到,并统计通过这个点的可能的路径数。该函数即前面提到的pathCount,其原型如下:

int pathCount(POS &ps, VETPOS& pre)

  ps表示当前位置向量中的一个点,pre表示前一个位置向量,返回值为通过ps点的可能路径数。函数实现代码如下:


上一页 [1] [2] [3] [4] [5] 下一页 




上一篇:新时代的门前 32位世界中的64位编程

下一篇:Windows Workflow Foundation之概述

一道Google中国挑战赛竞赛题的解法 相关文章:
·中国十大免费电影网站排行
·Google 全球偷窥真相调查
·利用Google突破封锁:下载想要的东西
·暴力摩托:死亡竞赛2000
·清除google搜索栏中的历史记录
·中国古代百句经典名言
·中国餐饮业市场调查预测报告
·中国百大寺庙全集
·Google搜索技巧2007版
·中国网络游戏风云榜 免费网游占2/3
一道Google中国挑战赛竞赛题的解法 相关软件:
·红色警戒 2 之中国崛起
·游遍中国 高清晰的PDF书籍系列经典珍藏版
·一生要读知的100本中国名书高清晰PDF
·中国地图jpg高清晰版
·中国少年儿童智力开发百科全书(上中下)高清PDF全彩图书
·创世卓越 - 中国传世书法高清晰PDF电子书
·创世卓越 - 典藏中国名胜高清晰PDF电子书
·上下五千年 中国历代帝王简介
·中国象棋
·中国象棋大师V3.1

特别声明:本站除部分特别声明禁止转载的专稿外的其他文章可以自由转载,但请务必注明出处和原始作者。文章版权归文章原始作者所有。对于被本站转载文章的个人和网站,我们表示深深的谢意。如果本站转载的文章有版权问题请联系编辑人员,我们尽快予以更正。
[打印本页] [关闭窗口] 转载请注明来源:http://www.viphot.com
| 帮助(?) | 版权声明 | 友情连接 | 关于我们 | 信息发布
Copyright 2007 www.viphot.com All Rights Reserved. 鄂ICP备05000083号Powered by:viphot