当前位置:首页 > 题解目录 > 正文内容

【题解】上学线路(2019青岛市程序设计比赛)

亿万年的星光4年前 (2021-04-16)题解目录2410

 【题目描述】

D从家到学校的道路结构是这样的:由n条东西走向和m条南北走向的道路构成了一个n*m的网格,每条道路都是单向通行的(只能从北向南,从西向东走)。

已知小D的家在网格的左上角,学校在网格的右下角。

问小D从他的家到学校一共有多少种不同的上学路线?

【输入格式】

两个正整数n,m,意义如前所述。

【输出格式】

D上学路线数量。结果对1000000007取余。

【输入输出样例】

roud.in

roud.out

3 4

10

【数据规模和约定】

50%的数据:n,m<=20

100%的数据: n,m<=1000

【来源】

2019年青岛市程序设计竞赛试题(小学组)1T

【题目分析】

  • 一个比较典型的DFS题目,跟“马拦过河卒”有点像。

  • 只能从北往南,从西往东走,不能走回头路。

  • 整个图的大小是由m和n决定的,比较坑的是题目中n*m的隐含意思是从(1,1)点开始(不然样例计算出是35)。



【参考代码1】——DFS没有优化

#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
int n,m; //定义B点坐标和马的坐标
int dx[2]= {0,1}; //x变化
int dy[2]= {1,0}; //y变化
bool flag[16][16]; //标记数组,用来标记哪些点能走或不能走
int sum; //定义总路径条数

//使用框架二
void dfs(int sx,int sy) {
	if(sx==n && sy==m) {
		sum++;  //到达b点就累加1
		return;
	}
	for(int i=0; i<2; i++) { //两种走法(下,右)
		int fx=sx+dx[i]; //某一方向的x坐标
		int fy=sy+dy[i]; //某一方向的y坐标
		if(flag[fx][fy]==0 && fx<=n && fy<=m) {  
			flag[fx][fy]=1; //将当前点变为1,表示此点已经走过了 
			dfs(fx,fy);     //继续遍历下一个点 
			flag[fx][fy]=0; //回溯一步 
		}
	}

}
int main() {
	cin>>n>>m; //读入n和m; 
	dfs(1,1); //从0,0开始遍历,
	cout<<sum%1000000007<<endl;
	return 0;
}



【后续优化】

可以使用

  • (a + b) % p = (a%p + b%p) %p

优化


【参考代码2】——数学关系(二维数组+递推)

如果上面的DFS感觉比较难,还有一个数学的思路可以用。

假设每个单元格的距离都是1,那么A->B1的走法是1种,A->C1的走法也是1种。

我们看一下A->D的走法有多少种。答案是2种,分别是从B1->D和从C1->D。(记住:B1和C1的走法已经确定了,这非常重要)

----------------------------------------

再来看A-G的走法。G点只能由D点和C2点走过来,D点的走法上面已经确定了(2种),从A到C2点只有一种走法,所以是2+1=3种。

可以得出结论:每个点的走法种数=这个点上方的种数+这个点左侧的种数。

也就是二维数组  a[i][j]=a[i-1][j]+a[i][j-1]

注意边界点即可。




扫描二维码推送至手机访问。

版权声明:本文由青少年编程知识记录发布,如需转载请注明出处。

分享给朋友:

相关文章

【题解】打击犯罪

【题目描述】某个地区有n(n<=1000)个犯罪团伙,当地警方按照他们的危险程度由高到低给他们编号为1-n,他们有些团伙之间有直接联系,但是任意两个团伙都可以通过直接或间接的方式联系,这样这里就...

【题解】2019 T2 公交换乘

【题目描述】著名旅游城市 B 市为了鼓励大家采用公共交通方式出行,推出了一种地铁换乘公交车的优惠方案:1、在搭乘一次地铁后可以获得一张优惠票,有效期为 45 分钟,在有效期内可以消耗这张优惠...

【题解】红与黑

【题解】红与黑

【题目描述】有一间长方形的房子,地上铺了红色、黑色两种颜色的正方形瓷砖。你站在其中一块黑色的瓷砖上,只能向相邻的黑色瓷砖移动。请写一个程序,计算你总共能够到达多少块黑色的瓷砖。【输入】包括多组数据。每...

【题解】放苹果(2)

【题目描述】把M个同样的苹果放在N个同样的盘子里,不允许有的盘子空着不放,问共有多少种不同的分法?(用K表示)5,1,1和1,5,1 是同一种分法。【输入】第一行是测试数据的数目t(0≤t≤20)。以...

【题解】装满杯子需要的最短总时长

【题目描述】现有一台饮水机,可以制备冷水、温水和热水。每秒钟,可以装满 2 杯 不同 类型的水或者 1 杯任意类型的水。给你一个下标从&nb...

【题解】BFS、DFS——走迷宫问题

【题目描述】给定一个 n×m的二维整数数组,用来表示一个迷宫,数组中只包含 0 或 1,其中 0 表示可以走的路,1 表示不可通过的墙壁。最初,有一个人位于左上角 (1,...