計算兩個座標點之間走最短距離有多少種走法
阿新 • • 發佈:2019-01-28
例如沿著一個網格點行走,從(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); } }