刚刚接触算法,尝试解决后无果,在此麻烦各位大佬帮我看一下我的问题出在了哪里。

P1002 [NOIP2002 普及组] 过河卒

@[西兰花馅饺子](/user/292562) 这是为什么 >当卒的位置在B点的下方或在B点的右方时,返回0。 你的思路是错的,递归写法有问题。我觉得参考一下这题题解会对你学习递归有更好的认识。
by Rbu_nas @ 2020-04-14 01:59:12


~~$dp$ 大法好~~ 显然您的递归里问题很多。 为何不用 $dp$?
by Kevin5308 @ 2020-04-14 06:34:42


你思路错了。我觉得你应该参考一下题解,那里面讲的不错。
by ChthollyMeow @ 2020-04-14 07:25:31


~~说句闲话,您的Soldier好像拼错了~~
by xrdrsp @ 2020-04-14 07:53:31


思路对了也AC不了,因为这道题需要高精度
by 金庆涵 @ 2020-04-14 07:59:47


高精度?
by whc2020 @ 2020-04-14 08:03:28


ull过得去吧
by djwj233 @ 2020-04-14 08:06:55


@[西兰花馅饺子](/user/292562) 你看看。 你的问题在于,判断和马的位置有问题。 但是即使这样也只有20分,递归太慢了。 ```cpp #include<iostream> using namespace std; int Bx, By, Cx, Cy; const int fx[] = {0, -2, -1, 1, 2, 2, 1, -1, -2}; const int fy[] = {0, 1, 2, 2, 1, -1, -2, -2, -1}; int Solider( int x, int y ) { if(x>Bx||y>By) return 0; if( x == Bx && y == By )//判断卒是否到达B点 return 1; int nx=Cx,ny=Cy,flag=1; for(int i=1;i<=8;i++) { int q=nx+fx[i],w=ny+fy[i]; if(x==q&&y==w) flag=0; } if(x==Cx&&y==Cy) flag=0; if(flag) return Solider( x+1, y ) + Solider( x, y+1 ); else return 0; } int main() { cin>>Bx>>By>>Cx>>Cy; cout<<Solider( 0, 0 )<<endl; return 0; } ```
by issue_is_fw @ 2020-04-14 08:08:58


@[西兰花馅饺子](/user/292562) 可以加个记忆化
by LongDouble @ 2020-04-14 08:10:36


@[西兰花馅饺子](/user/292562) 而且你这条语句问题很大 ```cpp return Solider( ++x, y ) + Solider( x, ++y ); ``` ++x已经改变了x的值,所以你这条语句相当于 ```cpp return Solider( x+1, y ) + Solider( x+1, y+1 ); ```
by issue_is_fw @ 2020-04-14 08:11:27


| 下一页