dfs 会超,正解应该用递推,而且你的 dfs 我也觉得很奇怪
这是我 5 个月前做这道题用的代码(写的有点丑,见谅):#include <iostream>
using namespace std;
long long ans,x1,y1,x2,y2;
bool m[30][30];
inline void setm(int x,int y)
{
if (x>=0&&y>=0)m[x][y]=1;
}
inline void dfs(int x,int y)
{
if (x==x1&&y==y1)
{
++ans;
return;
}
//printf("%d %d %d %d\n",x,y,m[x+1][y],m[x][y+1]);
if (x+1<=x1&&m[x+1][y]==0)
dfs(x+1,y);
if (y+1<=y1&&m[x][y+1]==0)
dfs(x,y+1);
}
int main()
{
scanf("%d%d%d%d",&x1,&y1,&x2,&y2);
setm(x2,y2);
setm(x2+1,y2+2);setm(x2+2,y2+1);
setm(x2-1,y2-2);setm(x2-2,y2-1);
setm(x2-1,y2+2);setm(x2-2,y2+1);
setm(x2+2,y2-1);setm(x2+1,y2-2);
dfs(0,0);
printf("%lld",ans);
}
当 dfs 到某个坐标的时候,就分别 dfs x + 1,y 和 x, y + 1,如果新位置是马占领的地方就不 dfs 了
你可以照这个代码改一下,或者改成记忆化搜索也行 |