1. 程式人生 > >acm過河卒

acm過河卒

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過河卒