acm過河卒
阿新 • • 發佈:2017-09-24
tdi edi 需要 p1010 有一個 med bsp 查詢 不用
如圖,A 點有一個過河卒,需要走到目標 B 點。卒行走規則:可以向下、或者向右。同時在棋盤上的任一點有一個對方的馬(如上圖的C點),該馬所在的點和所有跳躍一步可達的點稱為對方馬的控制點。例如上圖 C 點上的馬可以控制 9 個點(圖中的P1,P2 … P8 和 C)。卒不能通過對方馬的控制點。
棋盤用坐標表示,A 點(0,0)、B 點(n,m)(n,m 為不超過 20 的整數,並由鍵盤輸入),同樣馬的位置坐標是需要給出的(約定: C不等於A,同時C不等於B)。現在要求你計算出卒從 A 點能夠到達 B 點的路徑的條數。
1<=n,m<=15
輸入描述 :
B點的坐標(n,m)以及對方馬的坐標(X,Y){不用判錯}
輸出描述:
一個整數(路徑的條數)。
例樣輸入:
6 6 3 2
例樣輸出:
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; }
acm過河卒