1 solutions

  • 0
    @ 2026-1-28 9:15:34

    暴力解法

    #include<bits/stdc++.h>
    using namespace std;
    int n,m,X,Y;
    int dx[]={-1,-1,-2,-2,1,1,2,2,0};
    int dy[]={2,-2,1,-1,2,-2,1,-1,0};
    int dfs(int x,int y)
    {
      
        if(x==n&&y==m) return 1;
        for(int i=0;i<9;i++)
        {
            int a=X+dx[i],b=Y+dy[i];
            if(a==x&&b==y) return 0;
        }
        int res=0;
        if(x+1<=n) res+=dfs(x+1,y);
        if(y+1<=m) res+=dfs(x,y+1);
        return res;
    }
    int main()
    {
        cin>>n>>m>>X>>Y;
        cout<<dfs(0,0);
    }
    

    记忆化

    #include<bits/stdc++.h>
    using namespace std;
    int n,m,X,Y;
    int dx[]={-1,-1,-2,-2,1,1,2,2,0};
    int dy[]={2,-2,1,-1,2,-2,1,-1,0};
    const int N=25;
    long long f[N][N];
    long long dfs(int x,int y)
    {
        if(x==n&&y==m)//终点
        {
            return 1;
        }
        for(int i=0;i<9;i++) //当前点是非法点
        {
            int a=X+dx[i],b=Y+dy[i];
            if(a==x&&b==y) 
            {
               return 0;
            }
        }
        if(f[x][y]==-1) //记忆化搜索优化
        {
           
            f[x][y]=0;
            if(x+1<=n) f[x][y]+=dfs(x+1,y);
            if(y+1<=m) f[x][y]+=dfs(x,y+1);
            return f[x][y];
        }
        return f[x][y];
    }
    int main()
    {
        memset(f,-1,sizeof f);
        cin>>n>>m>>X>>Y;
        cout<<dfs(0,0);
        return 0;
    }
    
    • 1

    Information

    ID
    3039
    Time
    1000ms
    Memory
    256MiB
    Difficulty
    5
    Tags
    (None)
    # Submissions
    10
    Accepted
    3
    Uploaded By