博客
关于我
P1035 I need help
阅读量:795 次
发布时间:2023-02-26

本文共 1779 字,大约阅读时间需要 5 分钟。

Johnny Q 在你的帮助下终于进入了城堡,眼前是一条恐怖的黑水河。河中有大量传说中的食人怪兽——法克鱿,同时还有一个N层正三角梅花桩阵,每个桩上都印有一个数字。比如,图中展示的是一个4层的正三角梅花桩阵。

Johnny Q 只能从离他最近的即这个三角木桩阵的最上一个木桩开始,一个桩一个桩地跳到对岸去。每次他只能向左下或右下跳一次,跳的距离只能是一个单位步长。比如,最上面的7只能跳到3和8,而3又只能跳到4和1。这样的跳跃对身手矫健的Johnny Q 来说显然是小菜一碟,但CK也不是盏省油的灯,要想跳过还有一个要求:从你第一个桩跳到最后一个桩,所经过桩上的数字之和必须要等于M,否则就算跳到了最后一层的桩上,这个桩也会沉下去。例如,当M=21时,路径7->3->1->10是合法的,7->3->4->7也是合法的路径。现在你需要帮助Johnny Q判断是否存在这样的路径。

输入包括T组测试数据。每组测试数据包括两个整数N和M,其中N代表梅花桩的层数(2 ≤ N ≤ 10),M代表合法路径的数字和。接下来有N行,第i行有i个数字,代表这个N层梅花阵每层的数字,每个数字不会超过100。

输出对于每组测试数据,输出"Yes"或"No",代表是否存在这样的路径。

技术实现思路

我们可以使用深度优先搜索(DFS)来遍历所有可能的路径,并检查路径和是否等于M。具体步骤如下:

  • 初始化数据:读取输入的N和M,以及每层的数字,存储在二维数组中。
  • 递归遍历路径:从根节点(最上面的桩)开始,沿着左下和右下方向递归遍历,记录当前路径的数字和。
  • 检查终点:当到达最后一层时,检查路径和是否等于M。如果是,返回"Yes";否则,继续遍历其他路径。
  • 返回结果:如果所有可能路径都遍历完毕且没有找到符合条件的路径,返回"No"。
  • 代码实现

    #include 
    #include
    int N, M, flag = 0;int f[12][12]; // 假设层数最多为10层,位置索引从0开始void chazhao(int i, int j, int num) { num += f[i][j]; // 加上当前桩的数字 if (i == N - 1) { // 到达最后一层 if (num == M) { flag = 1; } return; } else { chazhao(i + 1, j, num); // 左下方向 chazhao(i + 1, j + 1, num); // 右下方向 }}int main() { int T, i, j, k; scanf("%d", &T); while (T--) { flag = 0; // 读取N和M scanf("%d %d", &N, &M); // 读取N层的数字 for (i = 0; i < N; ++i) { scanf("%d", &f[i][0]); for (j = 1; j < i; ++j) { scanf("%d", &f[i][j]); } } // 开始递归检查 chazhao(0, 0, f[0][0]); printf(flag ? "Yes" : "No"); }}

    逐步解释

  • 输入处理:首先读取测试数据的数量T。对于每个测试用例,读取N和M,然后读取每层的数字并存储在二维数组f中。
  • 递归函数:函数chazhao接受当前层数i、当前位置j和当前路径和num。每次递归时,num加上当前桩的数字,如果到达最后一层且num等于M,设置flag为1。
  • 遍历路径:从根节点(0,0)开始,递归地向左下和右下遍历,传递当前路径和num。
  • 结果输出:根据flag的值,输出"Yes"或"No"。
  • 这种方法确保了所有可能的路径都被检查,能够正确判断是否存在满足条件的路径。

    转载地址:http://ddvfk.baihongyu.com/

    你可能感兴趣的文章
    oracle 数据库dg搭建规范1
    查看>>
    oracle 时间转化函数及常见函数 .
    查看>>
    Oracle 权限(grant、revoke)
    查看>>
    oracle 查询clob
    查看>>
    Oracle 比较 B-tree 和 Bitmap 索引
    查看>>
    UML- 组件图(构件图)
    查看>>
    oracle 监听器的工作原理
    查看>>
    oracle 行转列
    查看>>
    Oracle 表
    查看>>
    oracle 课堂笔记
    查看>>
    Oracle 返回结果集的 存储过程
    查看>>
    Oracle 递归
    查看>>
    Oracle 递归函数与拼接
    查看>>
    oracle 逻辑优化,提升高度,综合SQL上下文进行逻辑优化
    查看>>
    oracle 闪回关闭,关闭闪回即disable flashback的操作步骤
    查看>>
    oracle 限制用户并行,insert /*parallel */ 到不同用户,并行起不来的问题
    查看>>
    oracle--用户,权限,角色的管理
    查看>>
    Oracle-定时任务-JOB
    查看>>
    oracle.dataaccess 连接池,asp.net使用Oracle.DataAccess.dll连接Oracle
    查看>>
    oracle00205报错,Oracle控制文件损坏报错场景
    查看>>