回溯法练习题

本文介绍了使用回溯法解决一系列编程练习题,包括菱形图案打印、牛妹的蛋糕问题、尼科彻斯定理验证、数字公式组合、油田问题的字符统计以及马在棋盘上的遍历问题。每道题都提供了问题描述、输入输出示例及解决方案代码。
摘要由CSDN通过智能技术生成

 

目录

前言

一、菱形图案

二、牛妹的蛋糕

三、尼科彻斯定理

四、ABC + DEF = GHI

五、油田问题

六、马的遍历问题

总结


前言

        回溯法:又称试探法

        从问题的某一种初始状态出发,搜索从这种状态出发所能达到的所有状态,当一条路走到“尽头”的时候(不能再前进),再后退一步或若干步,从另一种可能的状态出发,继续搜索,直到所有的“路径”(状态)都试探过为止。


一、菱形图案

问题描述:

        KiKi学习了循环,BoBo老师给他出了一系列打印图案的练习,该任务是打印用“*”组成的菱形图案。    

输入:

        多组输入,一个整数(2~20)。

输出:

        针对每行输入,输出用“*”组成的菱形,每个“*”后面有一个空格。每输出一个菱形的后面需要空一行。

         样例输入 :2    3     4

         样例输出 :

               *     
              * * 
             * * * 
              * * 
               * 

               * 
              * * 
             * * * 
            * * * * 
             * * * 
              * * 
               * 

               * 
              * * 
             * * * 
            * * * * 
           * * * * * 
            * * * * 
             * * * 
              * * 
               * 

解决代码如下:

import java.util.Scanner;
 
public class Main {
     
    public static void main(String[] args) {
        // TODO 自动生成的方法存根
        Scanner sc =new Scanner(System.in);
        while(sc.hasNext()) {
            int n=sc.nextInt();
            sort(n,n);
            System.out.println();
        }
    }
    static void sort(int n,int j) {
        if(n==0)
        {
            for(int i=0;i<n;i++)
            {
                System.out.print(" ");
            }
            for(int i=n;i<=j;i++)
            {
                System.out.print("*");
                System.out.print(" ");
                 
            }
            System.out.println();
            return;
        }
        else
        {
            for(int i=0;i<n;i++)
            {
                System.out.print(" ");
            }
            for(int i=n;i<=j;i++)
            {
                System.out.print("*");
                System.out.print(" ");
            }
            System.out.println();
            sort(n-1,j++);
            for(int i=0;i<n;i++)
            {
                System.out.print(" ");
            }
            for(int i=n;i<=j-1;i++)
            {
                System.out.print("*");
                System.out.print(" ");
            }
            System.out.println();
        }
         
         
         
    }
}

二、牛妹的蛋糕

题目描述:

        众所周知,牛妹非常喜欢吃蛋糕。第一天牛妹吃掉蛋糕总数三分之一多一个,第二天又将剩下的蛋糕吃掉三分之一多一个,以后每天吃掉前一天剩下的三分之一多一个,到第n天准备吃的时候只剩下一个蛋糕。牛妹想知道第一天开始吃的时候蛋糕一共有多少呢?

输入:

        输入n,0<n< 30。

输出:

        输出第一天蛋糕的数量。

样例输入 :2 

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
题目C要求我们在一个网格图中求一条从起点到终点的路径,其中有障碍物阻挡了一些格子。这可以用回溯法进行求解。 我们可以用一个二维数组来表示网格图,其中0表示可以通过的格子,1表示障碍物阻挡的格子,2表示路径上的格子。我们可以从起点开始,不断尝试向右、向下、向左、向上四个方向前进,如果前进的下一个格子是可以通过的,则继续前进;如果下一个格子是障碍物或者已经走过,则回溯到上一个格子重新选择方向前进。当我们到达终点时,我们就找到了一条从起点到终点的路径。 这个过程可以用递归函数来实现。具体实现过程如下: 1. 定义一个递归函数`dfs(x, y)`,表示从坐标(x, y)开始寻找路径。 2. 检查当前坐标是否越界。如果越界,则返回false。 3. 检查当前坐标是否为终点。如果是,则返回true。 4. 检查当前坐标是否为障碍物或者已经走过。如果是,则返回false。 5. 将当前坐标标记为已经走过。 6. 尝试向右、向下、向左、向上四个方向前进。如果有一个方向前进成功,则返回true。 7. 如果四个方向都不能前进,则将当前坐标标记为未走过,并返回false。 8. 在主函数中,从起点开始调用递归函数`dfs(0, 0)`,如果返回true,则表示找到了一条路径,可以输出路径;否则表示不存在路径。 需要注意的是,在标记一个坐标为已经走过时,我们需要使用一个变量来记录是否已经走过,因为在回溯的过程中,我们需要将已经走过的坐标重新标记为未走过。 以上就是题目C的建模过程,可以根据这个思路进行编程实现。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值