9.2 设想有个机器人坐在X*Y网格的左上角,只能向右、向下移动。机器人从(0,0)到(X,Y)有多少种走法?

进阶:

假设有些点为“禁区”,机器人不能踏足。设计一种算法,找到一条路径,让机器人从左上角移动到右下角。

类似leetcode:Unique PathsUnique Paths II

解法:

我们需要数一数机器人向右X步、向下Y步,总共可以走多少种路径。这条路径总共有X+Y步。

为了走出一条路径,我们实质上要从X+Y步为向右移动。因此,可能路径的总数就是从X+Y项中选出X项的方法总数。具体可以用下面的二项式(又称“n选r”)表示:

动态规划实现C++代码:

#include<iostream>
#include<vector>
using namespace std; //没有障碍时
int uniquePaths(int m,int n)
{
int path[m][n];
int i,j;
for(i=;i<m;i++)
path[i][]=;
for(j=;j<n;j++)
path[][j]=;
for(i=;i<m;i++)
{
for(j=;j<n;j++)
path[i][j]=path[i][j-]+path[i-][j];
}
return path[m-][n-];
} //存在障碍时
int uniquePathsII(vector<vector<int> > &obstacle)
{
int m=obstacle.size();
int n=obstacle[].size();
if(m==||n==)
return ;
int path[m][n];
int i,j;
if(obstacle[][]==)
return ;
path[][]=;
for(i=;i<m;i++)
{
if(obstacle[i][]==)
path[i][]=;
else
path[i][]=path[i-][];
}
for(j=;j<n;j++)
{
if(obstacle[][j]==)
path[][j]=;
else
path[][j]=path[][j-];
}
for(i=;i<m;i++)
{
for(j=;j<n;j++)
{
if(obstacle[i][j]==)
path[i][j]=;
else
path[i][j]=path[i-][j]+path[i][j-];
}
}
return path[m-][n-];
} int main()
{
cout<<uniquePaths(,)<<endl;
vector<vector<int> > vec={{,,},{,,},{,,}};
cout<<uniquePathsII(vec)<<endl;
}

最新文章

  1. iOS阶段学习第32天笔记(页面传值方法介绍)
  2. 利用CNN进行人脸年龄预测
  3. HTTP 源码解读
  4. iOS之02-第一个OC的类
  5. C#算法之向一个集合中插入随机不重复的100个数
  6. 以Self Host的方式来寄宿Web API
  7. log4net 日志写入MongoDB 实现分布式日志
  8. Java类的初始化过程及清理
  9. this的分析分支
  10. webstorm配置react
  11. JS表格排序
  12. bonecp使用数据源
  13. Hibernate2---- 查询单条记录
  14. ACdream 1015 Double Kings 树的重心
  15. MSSql-1内部数据库版本号
  16. figlet
  17. ImportError: dynamic module does not define module export function (PyInit__sqlite3)
  18. 59.phpstudy升级Mysql的正确姿势
  19. python爬虫之urllib
  20. 如何以SYSTEM用户运行CMD

热门文章

  1. 快速扫描文本文件,统计行数,并返回每一行的索引位置(Delphi、C#)
  2. Dojo Widget系统(转)
  3. 编译android后找不到ramdisk-u.img[已解决]
  4. 如何用C#获得文件信息以及扩展信息
  5. BZOJ_1833_[ZJOI2010]_数字计数_(数位dp)
  6. java web的一些特殊用法(一)
  7. SSL双向认证(高清版)
  8. CONTAINING_RECORD 宏
  9. Robotium 系列(1)
  10. C#索引器的作用及使用