问题 K: 【递归与递推】骑士游历问题

问题 K: 【递归与递推】骑士游历问题

题目
设有一个m*n的棋盘(2≤m≤50,2≤n≤50),在棋盘上任一点有一个中国象棋“马”,马走的规则为:马走日字;马只能向右走。当m,n给出后,同时给出马起始的位置和终点的位置,试找出从起点到终点所有路径的数目。
输入
m,n,xl,yl,x2,y2(分别表示棋盘大小、起点坐标和终点坐标)。
输出
路径数目(若不存在,则输出0)。
思路
同样的,思路和上一题很类似,使用记忆话搜索,但是存在一个问题:地图上从起点开始有很多点达不到,从终点回溯到起点的过程,可能会进过这些点,然后就会重复搜索,所以我们需要在一个点(x,y)搜索完了,若其dp[x][y]仍旧=0,将其置为-1;这样可以防止重复搜索这个点,或者使用visit[ ][ ]数组也行
注意
我一开始没考虑到一个点达不到,然后重复搜索的情况,T了

#include <iostream>

using namespace std;
int n,m,sx,sy,ex,ey;
long long dp[55][55]={0};
int Y[4]={1,-1,2,-2};
int X[4]={-2,-2,-1,-1};
long long slove(int x,int y)
{
    if(dp[x][y]) return dp[x][y];
    for(int i=0;i<4;i++)
    {
        int nx=x+X[i],ny=y+Y[i];
        if(nx<1||ny<1||nx>n||ny>m) continue;
        long long temp=slove(nx,ny);
        if(temp!=-1) dp[x][y]+=temp;
    }
    if(dp[x][y]==0) dp[x][y]=-1;///起点无法到达,置为-1,防止重复搜索
    return dp[x][y];
}
int main()
{

    cin>>n>>m>>sx>>sy>>ex>>ey;
    dp[sx][sy]=1;
    slove(ex,ey);
    cout << dp[ex][ey] << endl;
    return 0;
}
/*
50 50 2 2 50 50
*/

发布了95 篇原创文章 · 获赞 7 · 访问量 8455

猜你喜欢

转载自blog.csdn.net/Spidy_harker/article/details/100942039
今日推荐