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
//是一组好的测试数据,
//输入测试数据,跟踪程序,发现问题所在,如下图,是错误数据

//下图是正确数据

//边界上,若有马管辖的范围,那么之后的数据可能都是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;
}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值