1. 你没开`long long`,会溢出。
2. 考虑到路径数量会有很多(在没有马的时候可能性有$2^{n+m}$种情况),显然$O(2^{n+m})$的$\texttt{DFS}$无法通过,请注意。
by williamwei @ 2023-02-20 09:39:24
我把你的代码改了一下用的是dp的方法实现的。
你看看能不能理解
```
# include<bits/stdc++.h>
using namespace std;
#define ll long long
int x,y,n,m,sum=0;
ll a[25][25];
int dx[8]={-2,-1,1,2,2,1,-1,-2};
int dy[8]={-1,-2,-2,-1,1,2,2,1};
int main()
{
cin>>n>>m>>x>>y;
x++;
y++;
n++;
m++;
a[x][y]=-1;
for(int i=0;i<8;i++)
{
if((x+dx[i]>=1&&x+dx[i]<=n)&&(y+dy[i]>=1&&y+dy[i]<=m))
a[x+dx[i]][y+dy[i]] = -1;
}
a[1][1] = 1;
for(int i = 1; i <= n; i++){
for (int j = 1; j <= m; j++){
// cout << a[i][j] << ' ';
if(a[i][j] == -1){
a[i][j] = 0;
continue;
}
a[i][j] += a[i-1][j]+a[i][j-1];
}
// cout << endl;
}
cout<<a[n][m];
}
```
by Enguang_Cai @ 2023-02-20 13:38:12
```cpp
//代码如下,看看能不能理解:
#include<bits/stdc++.h>
using namespace std;
bool book[30][30];
long long a[30][30];
int x1,x2,y1,y2;
int main(){
cin >>x1>>y1>>x2>>y2;
book[x2][y2]=1;
if(x2>1 && y2!=0) book[x2-2][y2-1]=1;
if(x2>1 && y2!=20) book[x2-2][y2+1]=1;
if(x2!=0 && y2>1) book[x2-1][y2-2]=1;
if(x2!=0 && y2<19) book[x2-1][y2+2]=1;
if(x2!=20 && y2>1) book[x2+1][y2-2]=1;
if(x2!=20 && y2<19) book[x2+1][y2+2]=1;
if(x2<19 && y2!=0) book[x2+2][y2-1]=1;
if(x2<19 && y2!=20) book[x2+2][y2+1]=1;
for(int i=0;i<=x1;i++){
for(int j=0;j<=y1;j++){
if(book[i][j]!=1){
if(i==0 && j==0)
a[0][0]=1;
else if(i==0 && j>0)
a[0][j]=a[0][j-1];
else if(i>0 && j==0)
a[i][0]=a[i-1][0];
else
a[i][j]=a[i-1][j]+a[i][j-1];
}
}
}
cout<<a[x1][y1];
return 0;
}
by zyc220207 @ 2023-02-21 10:15:36