计算两个坐标点之间走最短距离有多少种走法
2016-04-05 00:30
381 查看
例如沿着一个网格点行走,从(a,b)到(c,d),每次只能横着走一步或者竖着走一步,一共有多少种走法,其实这个问题是一个变形之后的斐波那契数列问题,和青蛙跳台阶问题是一样的,假设(c,d)在(a,b)右上方,f(i,j)表示从坐标(i,j)到最终目的地走过最短路径个数,很容易知道有递推关系式
f(i,j)=f(i+1,j)+f(i,j+1),所以可以写一个递归程序,递归程序虽然代码简单,但是效率非常低,代码如下:
#include <iostream>
#include <cmath>
using namespace std;
int fun(int row,int col,int x,int y);
int main()
{
int startX,startY,endX,endY;
cout<<"请输入起点和终点坐标"<<endl;
cin>>startX>>startY>>endX>>endY;
cout<<"起点坐标为("<<startX<<","<<startY<<")"<<endl;
cout<<"终点坐标为("<<endX<<","<<endY<<")"<<endl;
int lenX=abs(startX-endX);
int lenY=abs(startY-endY);
cout<<fun(0,0,lenX,lenY);
return 0;
}
int fun(int row,int col,int x,int y){
if(row==x&&col==y-1)
return 1;
else if(row==x-1&&col==y)
return 1;
else{
if(row<x&&col<y)
return fun(row+1,col,x,y)+fun(row,col+1,x,y);
else if(row<x&&col==y)
return fun(row+1,col,x,y);
else if(row==x&&col<y)
return fun(row,col+1,x,y);
}
}
f(i,j)=f(i+1,j)+f(i,j+1),所以可以写一个递归程序,递归程序虽然代码简单,但是效率非常低,代码如下:
#include <iostream>
#include <cmath>
using namespace std;
int fun(int row,int col,int x,int y);
int main()
{
int startX,startY,endX,endY;
cout<<"请输入起点和终点坐标"<<endl;
cin>>startX>>startY>>endX>>endY;
cout<<"起点坐标为("<<startX<<","<<startY<<")"<<endl;
cout<<"终点坐标为("<<endX<<","<<endY<<")"<<endl;
int lenX=abs(startX-endX);
int lenY=abs(startY-endY);
cout<<fun(0,0,lenX,lenY);
return 0;
}
int fun(int row,int col,int x,int y){
if(row==x&&col==y-1)
return 1;
else if(row==x-1&&col==y)
return 1;
else{
if(row<x&&col<y)
return fun(row+1,col,x,y)+fun(row,col+1,x,y);
else if(row<x&&col==y)
return fun(row+1,col,x,y);
else if(row==x&&col<y)
return fun(row,col+1,x,y);
}
}
相关文章推荐
- 自己对设计模式的理解:工厂模式和单例模式
- nil、Nil、NULL和NSNull区别
- Odoo中Qweb使用入门
- struts笔记000:struts简介
- odoo openerp 分享-oe嵌入qweb】用js读取数据库数据,用类似html语言重写web报表
- 基于gensim模块的中文句子相似度计算工具
- OC阅读笔记十二:ARC(上)
- windows时间函数
- STL内存管理器的分配策略
- 很难吗?教你三天精仿一个跨平台的微信
- need improve123. Best Time to Buy and Sell Stock III
- 详解 CALayer 和 UIView 的区别和联系
- Delegate, Method as Parameter.
- Bayesian statistics
- 帮5买linux运维笔试题
- 面向对象的六大原则
- 反转链表
- 管理聚合链路和桥接网络(多网卡绑定,redhat liunx 7.0) 基础知识
- Android之EditText
- day26