题目描述
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;
}
这部分代码是主函数。在主函数中,我们首先定义了变量 x
、y
和 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;
}