过河卒 题解

过河卒

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

首先不考虑马的情况。
那么每一个位置,都可以从他的上方走来,和从他的左边走来。
那么很容易想到状态转移方程dp[i][j]=dp[i-1][j]+dp[i][j-1]
由于多了一个马,那么记录这个马控制的九个点,在对应的vis数组进行标记
如果vis[i][j]==1,那么就让dp[i][j]=0,else dp[i][j]=dp[i-1][j]+dp[i][j-1]
注意边界条件,卒子在第一行的时候,只能是从左边移动而来,卒子在第一列的时候,只能是从上面移动而来。
最后输出dp[n][n]即可

#include <bits/stdc++.h>
using namespace std;
#define ll long long
ll dp[22][22];
int vis[22][22];
int dx[8]={-1,-2,-2,-1,1,2,2,1};//x为横着移动
int dy[8]={-2,-1,1,2,2,1,-1,-2};
int main()
{
    int n,m,x,y;
    scanf("%d%d%d%d",&n,&m,&x,&y);
    for(int i=0;i<8;i++)
    {
        if(x+dx[i]>=0&&x+dx[i]<=n&&y+dy[i]>=0&&y+dy[i]<=m)
            vis[x+dx[i]][y+dy[i]]=1;
    }
    vis[x][y]=1;
    if(!vis[0][0]) dp[0][0]=1;
    for(int i=1;i<=n;i++)
    {
        if(vis[i][0])
            dp[i][0]=0;
        else
            dp[i][0]=dp[i-1][0];
    }
    for(int i=1;i<=m;i++)
    {
        if(vis[0][i])
            dp[0][i]=0;
        else
            dp[0][i]=dp[0][i-1];
    }
    for(int i=1;i<=n;i++)
    {
        for(int j=1;j<=m;j++)
        {
            if(vis[i][j])
                dp[i][j]=0;
            else
                dp[i][j]=dp[i-1][j]+dp[i][j-1];
        }
    }
    printf("%lld\n",dp[n][m]);
}
全部评论

相关推荐

06-15 02:05
已编辑
南昌航空大学 数据分析师
Eason三木:你如果想干技术岗,那几个发公众号合唱比赛的经历就去掉,优秀团员去掉,求职没用。然后CET4这种不是奖项,是技能,放到下面的专业技能里或者单独列一个英语能力。 另外好好改改你的排版,首行缩进完全没有必要,行间距好好调调,别让字和标题背景黏在一起,你下面说能做高质量PPT你得展现出来啊,你这简历排版我用PPT做的都能比你做的好。 然后自我评价,你如果要干数据工程师,抗压能力强最起码得有吧。
点赞 评论 收藏
分享
头顶尖尖的程序员:我也是面了三四次才放平心态的。准备好自我介绍,不一定要背熟,可以记事本写下来读。全程控制语速,所有问题都先思考几秒,不要急着答,不要打断面试官说话。
点赞 评论 收藏
分享
评论
1
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务