c++学习日记——绕开boss的一万种方法!

在牛客网刷题时碰见的一个很有意思的题,链接在此:牛客网原题
是说某苦逼员工所在的办公室非常大,而该员工的位置坐落在右上角,大门却在左下角,而该员工每次只向上,或者向右走,以最快回到座位,因为他不想被自己的boss们抓包。在把所有位置抽象为一个网格(门口的坐标为0,0)后,该苦逼员工决定研究一下如果他不通过boss们的位置,可以有多少种走法?
这个问题的输入描述为:
第一行 x,y,n (0<x<=30, 0<y<=30, 0<=n<= 20) ,(x,y)为员工的座位坐标,n 表示boss的数量( n <= 20)
接下来有n行, 表示boss们的坐标(0<xi<= x, 0<yi<=y,不会和该员工位置重合)

其实有很多种可以解决这个问题的方法,在参考了评论区一楼大佬的思路以后,发现这个思路相当精妙,特此记录(大佬不愧是大佬!)。
因为题目中的苦逼员工只会向上和向右走,而没有飞檐走壁斜着走的道行,所以我们能容易的解决这个问题。已知该员工的座位坐标为(x,y),那么我们采用分治的思想来解决这个问题,也就是若要考虑到某个点的路线数,只去考虑该点左边和下边的两点是否能到达该点,然后再去考虑这两点的左、下两点…就这样将大问题划分为小问题,我们以一个二维数组表示网格,一路从大门(0,0)开始尝试,若某个点(m,n)左边的点(m,n-1)不是boss座位,也就是可以到达该点,那么我们使点(m,n)的值等于原值加上点(m,n-1)的值,(m,n)下边的点同理。实际上我们求出了从大门到除了boss座位的所有位置的路线数,自然包括该员工的座位。代码如下:

#include <iostream>
using namespace std;
int main(){
    long long int site[31][31] = {0};
    int x,y,n;
    cin>>x>>y>>n;
    int xB,yB;
    while(cin>>xB>>yB)
        site[xB][yB]=-1;
    for(int i=0;i<y+1;i++)
        site[0][i]=1;
    for(int j=0;j<x+1;j++)
        site[j][0]=1;
    for(int i=1;i<=x;i++)
        for(int j=1;j<=y;j++){
            if(site[i][j]==-1)
                continue;
            if(site[i-1][j] != -1)
                site[i][j] += site[i-1][j];
            if(site[i][j-1] != -1)
                site[i][j] += site[i][j-1];
        }
    cout<<site[x][y]<<endl;
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值