DFS練習-codevs-1010過河卒
阿新 • • 發佈:2019-02-04
1010 過河卒
2002年NOIP全國聯賽普及組
時間限制: 1 s
空間限制: 128000 KB
題目等級 : 黃金 Gold
題目描述 Description
如圖,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
輸入描述 Input Description
鍵盤輸入
B點的座標(n,m)以及對方馬的座標(X,Y){不用判錯}
輸出描述 Output Description
螢幕輸出
一個整數(路徑的條數)。
樣例輸入 Sample Input
6 6 3 2
樣例輸出 Sample Output
17
資料範圍及提示 Data Size & Hint
如描述
#include <stdio.h> #include <string.h> int sum; bool book[20][20]; struct coordinate { int x; int y; }final,hourse,origin; void sign() { book[hourse.x][hourse.y]=1; if (hourse.x>=2) { book[hourse.x-2][hourse.y+1]=1; if (hourse.y>=1) { book[hourse.x-2][hourse.y-1]=1; } } if (hourse.x>=1) { if (hourse.y>=2) { book[hourse.x-1][hourse.y-2]=1; } book[hourse.x-1][hourse.y+2]=1; } if (hourse.y>=2) { book[hourse.x+1][hourse.y-2]=1; } if (hourse.y>=1) { book[hourse.x+2][hourse.y-1]=1; } book[hourse.x+1][hourse.y+2]=1; book[hourse.x+2][hourse.y+1]=1; } void dfs(struct coordinate now)//先下後右 { if (now.x==final.x && now.y==final.y) { sum++; return; } if (now.x<final.x && !book[now.x+1][now.y]) { now.x++; dfs(now); now.x--; } if (now.y<final.y && !book[now.x][now.y+1]) { now.y++; dfs(now); now.y--; } return; } int main(int argc, const char * argv[]) { scanf("%d%d%d%d",&final.x,&final.y,&hourse.x,&hourse.y); memset(book,0,sizeof(book)); origin.x=0; origin.y=0; sign(); dfs(origin); printf("%d",sum); return 0; }