测试案例过了没?
by miku_Silent @ 2021-10-17 13:27:53
正解
```cpp
#include<iostream>
#include<cstring>
#include<cstdio>
#include<algorithm>
#define ll long long
using namespace std;
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 bx, by, mx, my;
ll f[40][40];
bool s[40][40]; //判断这个点有没有马拦住
int main(){
scanf("%d%d%d%d", &bx, &by, &mx, &my);
bx += 2; by += 2; mx += 2; my += 2;
//坐标+2以防越界
f[2][1] = 1;//初始化
s[mx][my] = 1;//标记马的位置
for(int i = 1; i <= 8; i++) s[mx + fx[i]][my + fy[i]] = 1;
for(int i = 2; i <= bx; i++){
for(int j = 2; j <= by; j++){
if(s[i][j]) continue; // 如果被马拦住就直接跳过
f[i][j] = f[i - 1][j] + f[i][j - 1];
//状态转移方程
}
}
printf("%lld\n", f[bx][by]);
return 0;
}
by Master2021 @ 2021-10-17 15:30:13
加我的团队!
by Master2021 @ 2021-10-17 16:10:12
@[miku_Silent](/user/302945) 没
by shiyuke @ 2021-10-17 16:24:17
@[Master2021](/user/580597) 谢谢
by shiyuke @ 2021-10-17 16:25:45
@[shiyuke20091124](/user/575518) 兄弟没你就调呀,正解:
```cpp
#include<iostream>
using namespace std;
int n, m, cx, cy;
long long f[40][40], g[40][40];
int main()
{
cin>>n>>m>>cx>>cy;
f[0][0]=1;
g[cx][cy]=1;
if(cx-1>=0&&cy-2>=0)g[cx-1][cy-2]=1;
if(cx+1<=n&&cy-2>=0)g[cx+1][cy-2]=1;
if(cx-2>=0&&cy-1>=0)g[cx-2][cy-1]=1;
if(cx+2<=n&&cy-1>=0)g[cx+2][cy-1]=1;
if(cx-2>=0&&cy+1<=m)g[cx-2][cy+1]=1;
if(cx+2<=n&&cy+1<=m)g[cx+2][cy+1]=1;
if(cx-1>=0&&cy+2<=m)g[cx-1][cy+2]=1;
if(cx+1<=n&&cy+2<=m)g[cx+1][cy+2]=1;
for(int i=1; i<=n; i++)
if(!g[i][0])f[i][0]=f[i-1][0];
for(int j=1; j<=m; j++)
if(!g[0][j])f[0][j]=f[0][j-1];
for(int i=1; i<=n; i++)
for(int j=1; j<=m; j++)
{
if(g[i][j])f[i][j]=0;
if(!g[i][j])f[i][j]=f[i][j-1]+f[i-1][j];
}
cout<<f[n][m];
return 0;
}
```
by miku_Silent @ 2021-10-17 16:28:56
@[miku_Silent](/user/302945) 感谢感谢,这道题我想了一上午都没想出来
by shiyuke @ 2021-10-17 17:10:55
@[shiyuke20091124](/user/575518) 应该的
by miku_Silent @ 2021-10-18 21:27:22
不会吧!
by Master2021 @ 2021-10-19 12:47:22
是的
by shiyuke @ 2021-10-22 17:20:28