天天看点

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;

}