1. 程式人生 > >DFS練習-codevs-1010過河卒

DFS練習-codevs-1010過河卒

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;
}