数据结构java版五 图的应用

-图的表示_求补图

图的任何两个顶点间都有边,则称为:完全图。

从完全图中去掉本图的边所得到的图:补图。

不同的表示法如何求一个图的补图?

-深度优先遍历_填空题

填空题

如图a 所示的树形结构,从根节点开始的深度遍历是:___________

如图b 所示的图中,从a节点开始的深度遍历是:_______________

a.PNGb.PNG

                                      图a                                                             图b

-广度优先遍历_改造为递归方式

深度优先遍历的递归相似性很明显。

广度优先遍历可以用递归的解法吗?试把课程中解法改造为递归方式

-最短路径_求最小值

有1个人,要把n匹马从A村运往B村。

初始时,人和马都在A村。每次骑1匹马牵1匹马,回来时骑1匹马。

已知每匹马从A村到B村需要的时间(数字越大越慢)

两匹马同行时只能迁就较慢者。

求所有马匹都运到B村的最小的运输时间(此时,人和马都在B村)。

程序首先输入一个整数n(n<100),表示有n匹马。

接着是n行整数,表示马从A村到B村的所用的分钟数(小于1000)

程序输出:1个整数,表示所有马匹均运到B村的最小总耗时。

例如,

输入:
3
1
2
4
程序应输出:
7

输入:
4
1
4
2
5
程序应该输出:
12

-试探与回溯_找出更大差三角

仔细观察下面的数字组成的三角形:

   3
 1 4
5 6 2

看出什么特征吗?
首先,它包含了1~6的连续整数。
重要的是:每个数字都是其下方相邻的两个数字的差(当然是大数减去小数)
满足这样特征的三角形,称为:差三角。

你的任务是找出1~15的整数组成的一个更大的差三角。其形如:

    ?
   4 ?
  ? ? ?
 ? ? ? ?
? ? ? ? ?

-迷宫问题_按要求操作

小明正在玩一个“翻硬币”的游戏。

桌上放着排成一排的若干硬币。我们用 * 表示正面,用 o 表示反面(是小写字母,不是零)。

比如,可能情形是:**oo***oooo

如果同时翻转左边的两个硬币,则变为:oooo***oooo

现在小明的问题是:如果已知了初始状态和要达到的目标状态,每次只能同时翻转相邻的两个硬币,那么对特定的局面,最少要翻动多少次呢?
我们约定:把翻动相邻的两个硬币叫做一步操作,那么要求:

程序输入:
两行等长的字符串,分别表示初始状态和要达到的目标状态。每行的长度<1000

程序输出:
一个整数,表示最小操作步数

例如:
用户输入:
**********
o****o****

程序应该输出:
5

再例如:
用户输入:
*o**o***o***
*o***o**o***

程序应该输出:
1

-分酒问题_求最大不能组合出的数字

小明开了一家糖果店。他别出心裁:把水果糖包成4颗一包和7颗一包的两种。糖果不能拆包卖。

小朋友来买糖的时候,他就用这两种包装来组合。当然有些糖果数目是无法组合出来的,比如要买 10 颗糖。

你可以用计算机测试一下,在这种包装情况下,最大不能买到的数量是17。大于17的任何数字都可以用4和7组合出来。

本题的要求就是在已知两个包装的数量时,求最大不能组合出的数字。

输入:
两个正整数,表示每种包装中糖的颗数(都不多于1000)

要求输出:
一个正整数,表示最大不能买到的糖数

例如:
用户输入:
4 7
程序应该输出:
17

再例如:
用户输入:
3 5
程序应该输出:
7

-填写代码缺失部分

树形结构应用十分广泛。

下面这段代码根据用户添加的数据,在内存中构建一个逻辑上等价的树形结构。

通过ShowTree() 可以把它显示为控制中的样子。

其中:
a.add('a', 'b');
a.add('b', 'e');
表示:'b' 作为 'a' 的孩子节点;'e' 作为 'b'的孩子节点。
如代码中给出的示例数据,输出结果应该为:

a--b--e
|  |--f--j
|    |--k
|--c
|--d--g--h
  |--i


请阅读下面的代码,填写缺失的部分(下划线部分)。

注意:请把填空的答案(仅填空处的答案,不包括题面)存入考生文件夹下对应题号的“解答.txt”中即可。
直接写在题面中不能得分。

 

import java.util.*;

class MyTree
{
            private Map map = new HashMap();

            public void add(char parent, char child)
            {
                       List t = (List)map.get(parent);
                       if(t==null)
                       {
                                  t = new Vector();
                                  ____________________; // 填空1
                        }
                        t.add(child);
            }

            public List getChild(char x)
            {
                       return (List)map.get(x);
            }
}

public class My
{
            public static List showTree(MyTree tree, char x)
            {
                       List t = tree.getChild(x);

                       List r = new Vector();

                       if(t==null)
                        {
                                   r.add("" + x);
                                   return r;
                         }

                         for(int i=0; i<t.size(); i++)
                         {
                                   List ri = showTree(tree, t.get(i));
                                   for(int j=0; j<ri.size(); j++)
                                   {
                                             String pre = "| ";
                                             if(j==0)
                                             {
                                                       if(i==0)
                                                                    pre = x + "--";
                                                       else 
                                                                    pre = "|--";
                                             }
                                            else
                                             {
                                                       if(i==__________________) // 填空2
                                                       pre = " ";
                                                       else
                                                       pre = "| ";
                                             }

                                             r.add(pre + ri.get(j));
                            }
                }

               return r;
}

public static void main(String[] args)
{
               MyTree a = new MyTree();
               a.add('a', 'b');
               a.add('b', 'e');
               a.add('b', 'f');
               a.add('a', 'c');
               a.add('a', 'd');
               a.add('d', 'g');
               a.add('d', 'i');
               a.add('g', 'h');
               a.add('f', 'j');
               a.add('f', 'k');

               List lst = showTree(a, 'a');
               for(int i=0; i<lst.size(); i++)
               {
                            System.out.println(lst.get(i));
               }
       }
}

-编程解决问题

BMP是常见的图像存储格式。
如果用来存黑白图像(颜色深度=1),则其信息比较容易读取。

与之相关的数据:

(以下偏移均是从文件头开始)
偏移:10字节, 长度4字节: 图像数据真正开始的位置。
偏移:18字节, 长度4字节: 位图的宽度,单位是像素。
偏移:22字节, 长度4字节: 位图的高度,单位是像素。

从图像数据开始处,每个像素用1个二进制位表示。
从图片的底行开始,一行一行向上存储。

Windows规定图像文件中一个扫描行所占的字节数必须是4字节的倍数,
不足的位均以 0 填充。例如,图片宽度为45像素,实际上每行会占用
8个字节。

可以通过Windows自带的画图工具生成和编辑二进制图像。
需要在“属性”中选择“黑白”,指定为二值图像。
可能需要通过查看 | 缩放 | 自定义... 把图像变大比例一些,
更易于操作。

图像的左下角为图像数据的开始位置。白色对应1,黑色对应0

我们可以定义:两个点距离如果小于2个像素,则认为这两个点连通。
也就是说:以一个点为中心的九宫格中,围绕它的8个点与它都是连通的。
如:t1.bmp 所示,左下角的点组成一个连通的群体;
而右上角的点都是孤立的。

程序的目标是:根据给定的黑白位图,分析出所有独立连通的群体,输出每个连通群体的面积。所谓面积,就是它含有的像素的个数。

输入数据固定存在in.bmp中。

如示例的in.bmp,
程序应该输出:
12
81
52
133

该输出表示:共有4个连通群体。
输出的连通体面积间的顺序可以随意。

请编程解决上述问题。

我们测试程序的时候,会使用不同的in.bmp文件。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值