题解 | #过河卒#

过河卒

https://ac.nowcoder.com/acm/problem/16708

注意开long long !!!
题目考点:dp
题目大意:从起点到终点的路径数(多啰嗦一句,分析是dp还是bfs的点就是看求的是最短路径还是路径条数,两种算法解决的问题不同)
题目分析:dp[ i ] [ j ] 表示走到(i,j)的路径数,正常情况下dp[i][j]等于上面走下来和左边走过来的路径条数相加,即dp[ i ] [ j ] = dp[ i - 1 ] [ j ] + dp[ i ] [ j - 1 ]
遇到马控制的点特判即可

#include<iostream>
#include<algorithm>

using namespace std;
typedef long long LL;

const int N = 25;
LL  dp[N][N];
int dir[8][2] = {{-1, -2},{-2, -1},{-2, 1},{-1, 2},{1, 2},{2, 1},{2, -1},{1, -2}};

int main()
{
    int n, m, a, b;
    int x, y;
    scanf("%d%d%d%d", &n, &m, &a, &b);
    a += 1, b += 1, n += 1, m += 1;

    dp[1][1] = 1;  //起点
    dp[a][b] = -1; //马所在点

    for(int i = 0; i < 8; i++) //马控制点
    {
        x = a + dir[i][0];
        y = b + dir[i][1];
        if(x > 0 && y > 0)
            dp[x][y] = -1;
    }

    for(int i = 1; i <= n; i++)
    for(int j = 1; j <= m; j++)
    {
        if(dp[i][j] != -1)
        {
            if(dp[i-1][j] != -1)dp[i][j] += dp[i-1][j];
            if(dp[i][j-1] != -1)dp[i][j] += dp[i][j-1];
        }
    }

    printf("%lld", dp[n][m]);
    return 0;
}
题解专栏 文章被收录于专栏

希望不断进步

全部评论

相关推荐

不愿透露姓名的神秘牛友
10-05 10:13
已编辑
HHHHaos:让这些老登来现在秋招一下,简历都过不去
点赞 评论 收藏
分享
评论
1
收藏
分享
牛客网
牛客企业服务