2021 年 12 月青少年软编等考 C 语言四级真题解析

发布于:2024-12-18 ⋅ 阅读:(140) ⋅ 点赞:(0)

T1. 移动路线

桌子上有一个 m m m n n n 列的方格矩阵,将每个方格用坐标表示,行坐标从下到上依次递增,列坐标从左至右依次递增,左下角方格的坐标为 ( 1 , 1 ) (1,1) (1,1),则右上角方格的坐标为 ( m , n ) (m,n) (m,n)

小明是个调皮的孩子,一天他捉来一只蚂蚁,不小心把蚂蚁的右脚弄伤了,于是蚂蚁只能向上或向右移动。小明把这只蚂蚁放在左下角的方格中,蚂蚁从左下角的方格中移动到右上角的方格中,每步移动一个方格。蚂蚁始终在方格矩阵内移动,请计算出不同的移动路线的数目。

对于 1 1 1 1 1 1 列的方格矩阵,蚂蚁原地移动,移动路线数为 1 1 1 ;对于 1 1 1 2 2 2 列(或 2 2 2 1 1 1 列)的方格矩阵,蚂蚁只需一次向右(或向上)移动,移动路线数也为 1 1 1;…… 对于一个 2 2 2 3 3 3 列的方格矩阵,如下图所示:

(2,1) (2,2) (2,3)
(1,1) (1,2) (1,3)

蚂蚁共有 3 3 3 种移动路线:

  • 路线 1 1 1 ( 1 , 1 ) → ( 1 , 2 ) → ( 1 , 3 ) → ( 2 , 3 ) (1,1) → (1,2) → (1,3) → (2,3) (1,1)(1,2)(1,3)(2,3)
  • 路线 2 2 2 ( 1 , 1 ) → ( 1 , 2 ) → ( 2 , 2 ) → ( 2 , 3 ) (1,1) → (1,2) → (2,2) → (2,3) (1,1)(1,2)(2,2)(2,3)
  • 路线 3 3 3 ( 1 , 1 ) → ( 2 , 1 ) → ( 2 , 2 ) → ( 2 , 3 ) (1,1) → (2,1) → (2,2) → (2,3) (1,1)(2,1)(2,2)(2,3)

时间限制:1 s
内存限制:64 MB

  • 输入
    输入只有一行,包括两个整数 m m m n n n 0 < m + n ≤ 20 0<m+n\le 20 0<m+n20),代表方格矩阵的行数和列数, m m m n n n 之间用空格隔开。
  • 输出
    输出只有一行,为不同的移动路线的数目。
  • 样例输入
    2 3
    
  • 样例输出
    3
    

思路分析

此题考查动态规划,属于基础题。

定义 f i , j f_{i,j} fi,j 表示从 ( 1 , 1 ) (1,1) (1,1) 走到 ( i , j ) (i,j) (i,j) 的方法数,不难得出状态转移方程为
f i , j = f i − 1 , j + f i , j − 1 f_{i,j} = f_{i-1,j} + f_{i,j-1} fi,j=fi1,j+fi,j1

初始值为 f i , 0 = f 0 , j = 1 f_{i,0} = f_{0,j} = 1 fi,0=f0,j=1,其中 1 ≤ i ≤ n 1 \le i \le n 1in 1 ≤ j ≤ m 1 \le j \le m 1jm,事实上,我们可以将 f 1 , 0 f_{1,0} f1,0 f 0 , 1 f_{0,1} f0,1 初始化为 1 1 1,然后从第一行第一列开始求解。最终 f n , m f_{n,m} fn,m 即为答案。

/*
 * Name: T1.cpp
 * Problem: 移动路线
 * Author: Teacher Gao.
 * Date&Time: 2024/12/11 17:50
 */

#include <iostream>

using namespace std;

int main()
{
   
	ios::sync_with_stdio(false);
	cin.tie(0);
	
	int n, m, f[25][25] = {
   0};
	cin >> n >> m;

	f[1

网站公告

今日签到

点亮在社区的每一天
去签到