C++题目_逃生路线总数(dfs)

题目描述

2021年夏天,LSH开开心心的骑着电动车出去玩,结果一不留神,他骑着电动车进入了一只恶犬的领地。恶犬发现它的领地被LSH侵犯了,立马去追LSH,准备咬他一大口。LSH慌忙逃窜,但是他的电动车电量即将耗尽,现在请你帮忙计算一下,LSH能成功逃脱恶犬领地的路线一共有多少条?

输入描述

测试样例由多组测试数据组成。每组测试数据第一行输入5个整数 n , m ( 1 <= n,m <= 50) , t ( 1 <= t <= 50 ), i ( 0 <= i < n ) , j ( 0 <= j < m )
我们把恶犬的领地看做一个二维矩阵,其中 n 和 m代表恶犬的领地范围的行和列
t 代表LSH的电动车最多还能移动多少格 (只能上下左右移动,移动一次 t - 1 ,当 t 为 0 时则LSH不能移动)
i 和 j代表LSH被恶犬发现时的坐标

输出描述

输出LSH能够逃离恶犬的领地范围的路线总数,只要逃出恶犬领地范围(超出边界)则视为成功逃脱,由于答案很大,所以需要你需要将答案对 1000000007 取模。

测试样例1

输入数据

复制

2 2 2 0 0

输出数据

复制

6

提示

1.下图是对样例的解释
2.LSH一旦跑出边界,他是不会再回来了(他也不傻)
3.只要LSH还没跑出边界,他可以重复经过他之前经过的网格

#include<bits/stdc++.h>
using namespace std;

这部分代码是常见的包含头文件的部分,<bits/stdc++.h> 是一个万能头文件,包含了常用的标准库头文件。

int n, m, sum = 0;
int fx[4][2] = {{1, 0}, {0, 1}, {-1, 0}, {0, -1}};

这部分代码定义了几个变量。n 和 m 分别表示狗领地的列长和行宽。sum 是一个计数器,用于记录 LSH 能够成功逃脱恶犬领地的路线数。fx 是一个二维数组,用于表示四个方向的偏移量。每个方向的偏移量分别是 (1, 0)(0, 1)(-1, 0) 和 (0, -1)

void dfs(int x, int y, int t) {
    if (x < 0 || x >= n || y < 0 || y >= m) {
        sum++;
        return;
    }
    if (n - t >= 0 || m - t >= 0) {
        return;
    }
    if (t == 0) return;
    for (int i = 0; i < 4; i++) {
        int xx = x + fx[i][0];
        int yy = y + fx[i][1];
        dfs(xx, yy, t - 1);
    }
}

这部分代码定义了一个名为 dfs 的递归函数,用于进行深度优先搜索。函数的参数 x 和 y 表示当前位置的坐标,t 表示 LSH 的电动车还能移动的格数。

在函数的开头,我们首先判断当前位置 (x, y) 是否超出了狗领地的边界。如果超出了边界,说明 LSH 能够成功逃脱恶犬领地的路线数加一,并返回。

接下来,我们判断如果 n - t >= 0 或者 m - t >= 0,说明 LSH 到达不了边界,直接返回。这是一种剪枝的优化,可以减少不必要的递归。

然后,我们判断如果 t 的值为 0,说明电量已经用完,直接返回。

最后,我们使用一个循环遍历四个方向。对于每个方向,我们计算下一个位置 (xx, yy),它是当前位置 (x, y) 加上方向数组 fx 中对应方向的偏移量。然后,我们递归调用 dfs 函数,将 (xx, yy) 作为下一步的位置,t - 1 作为剩余电量。

int main() {
    int x, y, t;
    while (cin >> n >> m >> t >> x >> y) {
        sum = 0;
        dfs(x, y, t);
        cout << sum;
    }
    return 0;
}

这部分代码是主函数。在主函数中,我们首先定义了变量 xy 和 t,分别表示 LSH 所在的行、列和电动车还能移动的格数。

然后,我们使用一个循环来读取多组测试数据。在每次循环中,我们先将计数器 sum 的值重置为 0,然后调用 dfs 函数,计算 LSH 能够成功逃脱恶犬领地的路线数。最后,我们输出 sum 的值。

这样,代码就完成了。

完整代码(加注释)

#include<bits/stdc++.h>//万能头
using namespace std;//命名空间
int n,m,sum=0;// n 狗领地的列长 m 狗领地的行宽 sum LSH能成功逃脱恶犬领地的路线数
int fx[4][2]={{1,0},{0,1},{-1,0},{0,-1}};//定义方向数组fx
void dfs(int x,int y,int t){//定义dfs函数,输入x,y,t
    if(x<0 || x>=n|| y<0 ||y>=m){//如果x<=0 || x>n|| y<=0 ||y>m则判为超出边界
        sum++;//LSH能成功逃脱恶犬领地的路线数加1
        return ;//返回
    }
    if(n-t>=0 || m-t>=0){//如果n-t>=0 || m-t>=0就说明到达不了边,直接return   剪支
        return;//返回
    }
    if(t==0)return;//如果电量没了直接返回
    for(int i=0;i<4;i++){//循环四种方向
        int xx=x+fx[i][0];//定义xx
        int yy=y+fx[i][1];//定义yy
        dfs(xx,yy,t-1);//继续递归dfs
    }
}
int main(){//主函数
    int x,y,t;//x LSH所在地的行 y LSH所在地的列 t LSH的电动车最多还能移动多少格
    while(cin>>n>>m>>t>>x>>y/*输入n,m,x,y,t*/){//由于有多组测试数据组成所以用循环输入
        sum=0;//使sum等于0
        dfs(x,y,t);//执行dfs函数
        cout<<sum;//直接输出sum
    }
    return 0;//返回值
}

完整代码(不加注释)

#include<bits/stdc++.h>
using namespace std;

int n, m, sum = 0;
int fx[4][2] = {{1, 0}, {0, 1}, {-1, 0}, {0, -1}};

void dfs(int x, int y, int t) {
    if (x < 0 || x >= n || y < 0 || y >= m) {
        sum++;
        return;
    }
    if (n - t >= 0 || m - t >= 0) {
        return;
    }
    if (t == 0) return;
    for (int i = 0; i < 4; i++) {
        int xx = x + fx[i][0];
        int yy = y + fx[i][1];
        dfs(xx, yy, t - 1);
    }
}

int main() {
    int x, y, t;
    while (cin >> n >> m >> t >> x >> y) {
        sum = 0;
        dfs(x, y, t);
        cout << sum;
    }
    return 0;
}

  • 16
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值