文章分类 | 推荐文章 | 最新文章 | 热点文章 | 最新软件 | 精品软件 | 下载排行 | 推荐下载 | 免费看大片 | 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日 作者: 查看:[大字体 中字体 小字体]


int pathCount(POS &ps, VETPOS& pre)
{
 //初始为0
 ps.count = 0;
 int i;

 //遍历pre中的每个位置坐标
 for ( i=0; i < pre.size(); i++)
 {
  //计算cur与pre[i]的纵横坐标差的绝对值
  int xAbs = ps.x - pre[i].x;
  int yAbs = ps.y - pre[i].y;

  xAbs = xAbs < 0?-xAbs:xAbs;
  yAbs = yAbs < 0?-yAbs:yAbs;

  //判断是否可以移动到达
  if (( xAbs == 1 && yAbs < 2 ) ( yAbs == 1 && xAbs < 2 ) )
  {
   ps.count += pre[i].count;//统计通过ps点的可能路径数。
  }
 }
 return ps.count;
}
  3、统计所有符合条件的路径总数

  经过上述代码的运算,保存在最后的位置向量中的每一个点的count字段代表了这个点为终点的所有符合条件的路径数,我们只要将这些点的count值累加就可以得到find字符串在grid中符合条件的路径总数。当然累加时发现这个值已经大于1,000,000,000,时 就可以马上返回-1了。代码见后面的汇总代码。

  4、最后将这个类的实现代码汇总如下:

#include < string>
#include < vector>
#include < iostream>
#include < stdio.h>
using namespace std; //Required for TopCoder gcc compiler

//****************************************************************
//类名:WordPath
//作者:roc(txqc4@sohu.com)
//日期:2005-12-13
//用途: 本代码为实现上述竞赛题所作。
//注意事项:如欲转载,请保持本段说明。
//****************************************************************
class WordPath
{
 typedef struct POINTtag{
  int x;
  int y;
  int count;
 }POS;
 typedef vector< POS> VETPOS;

 public:

 int countPaths(vector < string> grid, string find)
 {
  int findStrLen = find.length();
  int gridSize = grid.size();
  int gridStrLen = grid[0].length();

  vector < VETPOS> vec(findStrLen);

  int i,j,k;

  // 遍历grid中的每一个字符
  for ( i = 0; i < gridSize; i ++)
  {
   for ( j= 0; j < gridStrLen; j++)
   {
    for ( k=0; k< findStrLen; k++)
    {
     char ch = find.at(k);
     //如果与find中位置k的字符相等,则将相应的grid中的位置坐标保存到相应的向量中去
     if ( ch == grid[i].at(j) )
     {
      POS ps;
      ps.x =j;
      ps.y = i;

      //位置向量0中所有坐标的初始值为1,而其他位置向量中坐标的这个字段总会被指零后才计算
      ps.count = 1;
      vec[k].push_back(ps);
     }
    }
   }
  }

  // 如果有find中的字符在grid中不存在则返回0
  for ( k=0; k< findStrLen; k++)
  {
   if ( vec[k].size() == 0 )
    return 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;
   }
  }

  // 统计保存在最后位置向量中的点的count值
  int count = 0;
  for ( j=0; j < vec[findStrLen-1].size(); j++)
  {
   POS cur = vec[findStrLen-1][j];
   count += cur.count;
   if (count > 1000000000 )
    return -1;
  }
  return count;
 }

 int pathCount(POS &ps, VETPOS& pre)
 {
  //初始为0
  ps.count = 0;
  int i;

  //遍历pre中的每个位置坐标
  for ( i=0; i < pre.size(); i++)
  {
   //计算cur与pre[i]的纵横坐标差的绝对值
   int xAbs = ps.x - pre[i].x;
   int yAbs = ps.y - pre[i].y;

   xAbs = xAbs< 0?-xAbs:xAbs;
   yAbs = yAbs< 0?-yAbs:yAbs;

   //判断是否可以移动到达
   if (( xAbs == 1 && yAbs < 2 ) ( yAbs == 1 && xAbs < 2 ) )
   {
    ps.count += pre[i].count;//统计通过ps点的可能路径数。
   }
  }

  return ps.count;
 }
};
  三、小结

  1、我的解题思路尤其是统计那一块多少参考了以前学过的运筹学中的动态规划的思路。

  2、遍历grid中的每一个字符的算法若改动为如下的代码:


上一页 [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