WA,求助大佬,本蒟蒻感激不尽

P1002 [NOIP2002 普及组] 过河卒

@[会唱歌的石榴](/space/show?uid=35667) 代码帮你改好了,可以过此题 ```cpp #include <iostream> #include <cstdio> #include <cstring> using namespace std; long long f[1011][1011]; bool b[1011][1011]; int dx[9]={0,1,1,2,2,-1,-1,-2,-2}; int dy[9]={0,2,-2,1,-1,2,-2,1,-1}; long long n,m,x,y; int main(){ scanf("%lld %lld %lld %lld",&n,&m,&x,&y); for (int i=0; i<=8; ++i) if(x+dx[i]>=0 && x+dx[i]<=n && y+dy[i]>=0 && y+dy[i]<=m) b[x+dx[i]][y+dy[i]]=1; memset(f,0,sizeof(f)); f[0][0]=1; for (int i=0; i<=n; ++i) for (int j=0; j<=m; ++j) { if(!b[i-1][j] && i-1>=0) f[i][j]+=f[i-1][j]; if(!b[i][j-1] && j-1>=0) f[i][j]+=f[i][j-1]; } printf("%lld",f[n][m]); return 0; } ``` 源代码有两个错误的地方: $1.$ 卒是从 $(0,0)$ 开始走,而非 $(1,1)$ $2.$ 不能像这样初始化 ```cpp for (int i=1; i<=n; ++i) if (b[i][1]==1) f[i][1]=1; for (int j=1; j<=m; ++j) if (b[1][j]==1) f[1][j]=1; ``` 因为如果在边缘的路径上被马给控制了,那么和这个点同一列的在它以下的点都没有路径可走,但是这样做却会给他们赋值成 $1$ 综上所述,就是您 $WA$ 的原因
by zhz小蒟蒻 @ 2019-08-08 18:52:15


太感谢了
by 会唱歌的石榴 @ 2019-08-08 19:34:00


|