递归似乎很对,但是20分,过不了样例

P1002 [NOIP2002 普及组] 过河卒

@[bugwriter](/user/543206) 你的way数组是干嘛用的
by KSA_Khinomov @ 2021-10-02 13:36:41


@[bugwriter](/user/543206) 你把 ```cpp if ((x==1&&y==0)||(x==0&&y==1)) return 1; ``` 改成 ```cpp if (x==0&&y==0) return 1; ```
by KSA_Khinomov @ 2021-10-02 13:39:53


@[TOTGOD](/user/479532) 本来想写递推,太麻烦
by lzber @ 2021-10-02 13:58:15


@[TOTGOD](/user/479532) 试过了,输出一毛一样
by lzber @ 2021-10-02 13:58:53


@[bugwriter](/user/543206) 可能是重复走到一个点,然后加了好几次? 建议用递推,如果你用递归的话就会 T 掉,递归的层数太多了
by Carnival @ 2021-10-02 14:34:19


@[bugwriter](/user/543206) 这题正解是dp,建议你写一下递推
by KSA_Khinomov @ 2021-10-03 07:43:25


@[TOTGOD](/user/479532) 写完递推,成功爆0 ```CPP #include<iostream> using namespace std; char br[100][100]; int way[100][100]; int bx,by,x,y; void knight() { cin>>x>>y; if (x-2>=0&&y-1>=0) br[x-2][y-1]='/'; if (x-2>=0&&y+1>=0) br[x-2][y+1]='/'; if (x-1>=0&&y-2>=0) br[x-1][y-2]='/'; if (x+1>=0&&y-2>=0) br[x+1][y-2]='/'; if (x+2>=0&&y-1>=0) br[x+2][y-1]='/'; br[x+2][y+1]='/'; br[x+1][y+2]='/'; br[x][y]='/'; if(x-1>=0&&y+2>=0) br[x-1][y+2]='/'; } int main() { knight(); way[0][0]=1; for (int i=0;i<=bx;i++) { for (int j=0;j<=by;j++) { if (br[i][j]!='/') { if (i-1>=0) way[i][j]+=way[i-1][j]; if (j-1>=0) way[i][j]+=way[i][j-1]; } } } cout<<way[bx][by]<<endl; //for (int i=0;i<=9;i++) { // for (int j=0;j<=9;j++) cout<<br[i][j]; //cout<<endl; //} return 0; } ``` 输出和递归一模一样 5个WA
by lzber @ 2021-10-03 12:10:14


@[bugwriter](/user/543206) 来送你篇正解 ```cpp #include<iostream> #include<cstring> using namespace std; long long a[30][30]; int vis[30][30],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,nx,ny,i,j; memset(vis,0,sizeof(vis)); cin>>n>>m>>x>>y; a[0][0]=0; 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(j=0;j<=m;j++){ if(vis[0][j]==1) while(j<=m) j++,a[0][j]=0; else a[0][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]; cout<<a[n][m]; return 0; } ```
by KSA_Khinomov @ 2021-10-03 15:44:15


想过样例的的话,你可以用贪心。
by joeqiao @ 2021-10-06 09:41:26


递归非正解,但我也写了,除了两个tle 其余ac,可看下我的 ```cpp #include<iostream> #include<cstring> using namespace std; int n, m, n0, m0; long long ans = 0; bool map[21][21]; void dfs(int u, int x, int y) { if (u == n + m) { ans++; return; } if (x < n) { if (!map[x][y]) return; else dfs(u + 1, x + 1, y); } if (y < m) { if (!map[x][y]) return; else dfs(u + 1, x, y + 1); } } int main() { memset(map, true, sizeof(map)); cin >> n >> m >> n0 >> m0; map[n0][m0] = map[n0 + 2][m0 + 1] = map[n0 + 2][m0 - 1] = map[n0 - 2][m0 + 1] = map[n0 - 2][m0 - 1] = map[n0 + 1][m0 + 2] = map[n0 + 1][m0 - 2] = map[n0 - 1][m0 + 2] = map[n0 - 1][m0 - 2] = false; dfs(0, 0, 0); cout << ans << endl; return 0; } ```
by A_pier @ 2021-10-27 19:57:45


|