如圖,A 點有一個過河卒,須要走到目標 B 點。卒行走規則:能夠向下、或者向右。同時在棋盤上的任一點有一個對方的馬(如上圖的C點),該馬所在的點和全部跳躍一步可達的點稱爲對方馬的控制點。例如上圖 C 點上的馬能夠控制 9 個點(圖中的P1,P2 … P8 和 C)。卒不能經過對方馬的控制點。spa
棋盤用座標表示,A 點(0,0)、B 點(n,m)(n,m 爲不超過 20 的整數,並由鍵盤輸入),一樣馬的位置座標是須要給出的(約定: C不等於A,同時C不等於B)。如今要求你計算出卒從 A 點可以到達 B 點的路徑的條數。code
1<=n,m<=15blog
輸入描述 :遞歸
B點的座標(n,m)以及對方馬的座標(X,Y){不用判錯}
輸出描述:io
一個整數(路徑的條數)。
例樣輸入:class
6 6 3 2
例樣輸出:im
17
解題:查詢
/* 做者:Auler 題目:p1010 過河卒 */ #include <stdio.h> int a,b,i,j,n,m,x,y,point[16][16],count=0; void sdf(int nowx,int nowy){ if(nowx > n || nowy > m ){ return ; } if(point[nowx][nowy]==1){ return ; } if(nowx==n && nowy ==m){ count++; return ; } sdf(nowx+1,nowy); sdf(nowx,nowy+1); return ; } int main() { scanf("%d%d%d%d", &n, &m,&x,&y); //控制點<=9個點 point[x][y]=1; for(i=1;i<=2;i++){ for(j=1;j<=4;j++){ if(j==1){ a=3-i+x; b=i+y; }else if(j==2){ a=x-(3-i); b=y-i; }else if(j==3){ a=x-i; b=3-i+y; }else{ a=i+x; b=y-(3-i); } point[a][b]=1; } } //遞歸,深度查詢 sdf(0,0); printf("%d",count); return 0; }