1. 程式人生 > >計算兩個座標點之間走最短距離有多少種走法

計算兩個座標點之間走最短距離有多少種走法

例如沿著一個網格點行走,從(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);
		}
			
}