天天看點

NOIP 2002 普及組 複賽 過河卒

//NOIP 2002 普及組 複賽 過河卒

//1314 【例3.6】過河卒(Noip2002)

//洛谷 P1002 過河卒

//樣例每通過,仔細看題,發現起點是從(0,0)開始,而誤以為是(1,1)開始,修改代碼

//樣例通過,送出,測試點3,4WA,重新讀題,發現沒說A!=B

//處理了A==B的情況,送出,測試點3,4WA,

//輸入:

//4 8 2 4

//輸出:

//0

//是一組好的測試資料,

//輸入測試資料,跟蹤程式,發現問題所在,如下圖,是錯誤資料

NOIP 2002 普及組 複賽 過河卒

//下圖是正确資料

NOIP 2002 普及組 複賽 過河卒

//邊界上,若有馬管轄的範圍,那麼之後的資料可能都是0,所謂一夫當關,萬夫莫開。

//馬上就行修改,送出AC。

//不借助測試資料,這個錯誤極難發現。

//2017-10-29 19:39

#include <stdio.h>

#include <string.h>

long long a[30][30];

int vis[30][30];

int next[][2]={{2,1},{1,2},{-1,2},{-2,1},{-2,-1},{-1,-2},{1,-2},{2,-1}};

int main(){

    int n,m,x,y,i,j,nx,ny;

    memset(vis,0,sizeof(vis));

    scanf("%d%d%d%d",&n,&m,&x,&y);

    a[0][0]=0;//此處寫成vis[0][0]=1,a[0][0]=0;//處理A==B的情況

    vis[x][y]=1,a[x][y]=0;//設定馬管轄的位置

    for(i=0;i<8;i++){

        nx=x+next[i][0],ny=y+next[i][1];

        if(0<=nx&&nx<=n&&0<=ny&&ny<=m){

            vis[nx][ny]=1,a[nx][ny]=0;

        }

    }

    for(i=0;i<=n;i++)

        if(vis[i][0]==1)while(i<=n){i++,a[i][0]=0;}

        else a[i][0]=1;//for(i=0;i<=n;i++)a[i][0]=1;//此處寫成 for(i=0;i<=n;i++)a[i][1]=1;

    for(j=0;j<=m;j++)

        if(vis[0][j]==1)while(j<=m){j++,a[0][j]=0;}

        else a[0][j]=1;//for(j=0;j<=m;j++)a[0][j]=1;//此處寫成 for(j=0;j<=m;j++)a[1][j]=1;

    for(i=1;i<=n;i++)

        for(j=1;j<=m;j++)

            if(vis[i][j]==0)

                a[i][j]=a[i][j-1]+a[i-1][j];

    printf("%lld\n",a[n][m]);

    return 0;

}