40分求大佬帮忙看看

P1002 [NOIP2002 普及组] 过河卒

@[AveryJH](/user/979902) 你这个特判的地方有些问题。 首先是step函数里第一个判断是否到达A点时应该是x和y同时为0才能赋值成1,还有就是你的数组开小了,题目是 n,m <= 20,但是数组的编号是从0开始排序的,所以你要用到第20位,就至少要开到memory[21][21] ```cpp #include<iostream> #include<cmath> #include<algorithm> #include<cstring> using namespace std; //存储已知路径数 long long int memory[21][21]; long long int step(int x1 ,int y1 , int x2 ,int y2 ){ if(x1 == 0 && y1 == 0){ memory[x1][y1]=1; return 1; } //马的看守范围 else if(abs(x2-x1)+abs(y2-y1)==3 && x1!=x2 &&y1!=y2){ memory[x1][y1]=0; return 0; } //马的位置 else if(x1==x2&&y1==y2){ memory[x1][y1]=0; return 0; } if(memory[x1][y1] != -1){ return memory[x1][y1]; } long long int result; if(x1 - 1 >= 0 && y1 - 1 >= 0) result = step(x1-1,y1,x2,y2)+step(x1,y1-1,x2,y2); else if(x1 - 1 >= 0 && y1 - 1 < 0) result = step(x1-1,y1,x2,y2); else if(x1 - 1 < 0 && y1 - 1 >= 0) result = step(x1,y1-1,x2,y2); memory[x1][y1]=result; return result; } int main(){ int a,b,c,d; cin>>a>>b>>c>>d; //a,b b pos //c,d ma pos //初始化二维数组 memset(memory,-1,sizeof memory); //cout<<a<<b<<c<<d<<endl; cout<<step(a,b,c,d)<<endl; return 0; } ```
by calm_alone @ 2023-03-28 18:20:55


```cpp #include <cmath> #include <cctype> #include <cstdio> #include <cstdlib> #include <iostream> #include <algorithm> #define ll long long inline int read(){ int num = 0; char c = getchar(); while(!isdigit(c)) c = getchar(); while(isdigit(c)) num = (num << 1) + (num << 3) + (c ^ '0'), c = getchar(); return num; } int bx, by, mx, my; ll f[30]; inline bool check(int x, int y) { if(x == mx && y == my) return 1; return (std::abs(mx - x) + std::abs(my - y) == 3) && (std::max ((std::abs(mx - x)), std::abs(my - y)) == 2); } int main(){ bx = read() + 2, by = read() + 2, mx = read() + 2, my = read() + 2; f[2] = 1; for(int i = 2; i <= bx; i++){ for(int j = 2; j <= by; j++){ if(check(i, j)){ f[j] = 0; continue; } f[j] += f[j - 1]; } } printf("%lld\n", f[by]); return 0; } ```
by lihaoyu9889 @ 2023-03-31 19:56:02


|