acm過河卒

如圖,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;
}
相關文章
相關標籤/搜索