题目来源:POJ 1057 File Mapping

题目大意:像我的电脑那样显示文件夹和文件信息,其中在同一级目录内,文件夹排在文件的前面并且文件夹的顺序不变,同一级目录中文件按字母序排列。文件以‘f’开头,文件夹以‘d’开头,‘*’表示一个case的结束,‘#’表示所有输入内容结束。

解题思路:递归创建,最后递归输出。算法比较简单,我就不细说了,具体看代码:

具体算法(java版,可以直接AC)

 import java.util.*;

 public class Main {
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
Node root = null;
Node parent = null;
String line = "";
int count = 1;
do {
root = new DirectoryNode("ROOT", null);
parent = root;
do {
line = input.next();
if (line != null && !line.isEmpty()) {
line = line.trim();
Node childNode=null;
if (line.startsWith("f")) {
childNode=new FileNode(line,parent);
parent.children.add(childNode);
}else if (line.startsWith("d")) {
childNode=new DirectoryNode(line,parent);
parent.children.add(childNode);
parent=childNode;
}else if (line.startsWith("]")) {
if(parent!=null){
parent=parent.parent;
}
}
}
} while (!line.startsWith("*"));
System.out.println(String.format("DATA SET %s:", count++));
root.output();
if(!line.startsWith("#")){
System.out.println();
}
} while (!line.startsWith("#"));
}
} abstract class Node {
public String name;
public Node parent;
public String prefix;
public List<Node> children; public Node(String name, Node parent) {
this.name = name;
this.parent = parent;
this.prefix = "";
if (this.parent != null) {
this.prefix = this.parent.prefix + this.prefix;
}
this.children = new ArrayList<Node>();
} public void sort() {
Collections.sort(this.children, new Comparator<Node>() {
public int compare(Node left, Node right) {
if (left instanceof DirectoryNode) {
return -1;
}else{
if (right instanceof FileNode){
return left.name.compareTo(right.name);
}else{
return 1;
}
}
}
});
} public abstract void output();
} class FileNode extends Node { public FileNode(String name, Node parent) {
super(name, parent);
} @Override
public void output() {
if (this.parent != null) {
this.prefix = this.parent.prefix + this.prefix;
}
System.out.println(this.prefix + this.name);
}
} class DirectoryNode extends Node { public DirectoryNode(String name, Node parent) {
super(name, parent);
} @Override
public void output() {
if (this.parent != null) {
this.prefix = this.parent.prefix + "| ";
}
System.out.println(this.prefix + this.name);
this.sort();
for (Node child : this.children) {
child.output();
}
}
}

PS:本人比较喜欢设计模式,因此在写算法的时候也会想用一些设计模式里面的知识,其实在ACM比赛中,这样是不好的,效率低。

如果有哪里不清楚的,可以给我留言!

POJ 1057 File Mapping 最详细的解题报告的更多相关文章

  1. OpenJudge 2775 文件结构“图”/ Poj 1057 FILE MAPPING

    1.链接地址: http://bailian.openjudge.cn/practice/2775 http://poj.org/problem?id=1057 2.题目: 总时间限制: 1000ms ...

  2. POJ 1046 Color Me Less 最详细的解题报告

    题目来源:POJ 1046 Color Me Less 题目大意:每一个颜色由R.G.B三部分组成,D=Math.sqrt(Math.pow((left.red - right.red), 2)+ M ...

  3. POJ 1063 Flip and Shift 最详细的解题报告

    题目来源:Flip and Shift 题目大意:一个椭圆形的环形容器中有黑色和白色两种盘子,问你是否可以将黑色的盘子连续的放在一起.你可以有以下两种操作: 1.顺时针旋转所有的盘子 2.顺时针旋转3 ...

  4. POJ 1047 Round and Round We Go 最详细的解题报告

    题目链接:Round and Round We Go 解题思路:用程序实现一个乘法功能,将给定的字符串依次做旋转,然后进行比较.由于题目比较简单,所以不做过多的详解. 具体算法(java版,可以直接A ...

  5. POJ 1050 To the Max 最详细的解题报告

    题目来源:To the Max 题目大意:给定一个N*N的矩阵,求该矩阵中的某一个矩形,该矩形内各元素之和最大,即最大子矩阵问题. 解题方法:最大子序列之和的扩展 解题步骤: 1.定义一个N*N的矩阵 ...

  6. POJ 1095 Trees Made to Order 最详细的解题报告

    题目来源:Trees Made to Order 题目大意:根据下面的规则给一棵二叉树编号: 规则1:如果二叉树为空,则编号为0: 规则2:如果二叉树只有一个节点,则编号为1: 规则3:所有含有m个节 ...

  7. poj 2739 Sum of Consecutive Prime Numbers 解题报告

    题目链接:http://poj.org/problem?id=2739 预处理出所有10001以内的素数,按照递增顺序存入数组prime[1...total].然后依次处理每个测试数据.采用双重循环计 ...

  8. 广大暑假训练1(poj 2488) A Knight's Journey 解题报告

    题目链接:http://vjudge.net/contest/view.action?cid=51369#problem/A   (A - Children of the Candy Corn) ht ...

  9. [poj 2891] Strange Way to Express Integers 解题报告(excrt扩展中国剩余定理)

    题目链接:http://poj.org/problem?id=2891 题目大意: 求解同余方程组,不保证模数互质 题解: 扩展中国剩余定理板子题 #include<algorithm> ...

随机推荐

  1. HTML常用API(位置信息、音频视频)

    感谢:链接(讲解的很详细) 位置信息 1.代码: <script type="text/javascript"> navigator.geolocation.getCu ...

  2. LR字符串处理函数-lr_save_datetime

    void lr_save_datetime(const char *format, int offset, const char *name); 中文解释: lr_save_datetime将当前日期 ...

  3. logging模块封装

    logging模块封装 #!/usr/bin/env python # -*- coding: utf-8 -*- import datetime import logging import env ...

  4. 面试问Redis集群,被虐的不行了......

    哨兵主要针对单节点故障无法自动恢复的解决方案,集群主要针对单节点容量.并发问题.线性可扩展性的解决方案.本文使用官方提供的redis cluster.文末有你们想要的设置ssh背景哦! 本文主要围绕如 ...

  5. docker配置国内镜像地址,解决无法pull镜像问题docker: Error response from daemon

    问题: 执行命令 $ docker run -it --rm -p 8888:8080 tomcat:8.5.32 报错 Unable to find image 'tomcat:8.5.32' lo ...

  6. ps学习。

    ps软件及教程,这些东西,你应该要花一辈子来消化.

  7. tap4fun(成都尼必鲁)--2020春招实习

    笔试 可能是我做过最简单的笔试了,只有选择填空,而且难度都不是很大,没啥印象了,考点和其他公司的笔试都差不多. 一面(技术面) 具体的不太记得了,因为这是我很后面面的了,所以问题基本都是那几个问题,都 ...

  8. 阿里云centos7安装redis全过程记录

    Redis下载地址:https://redis.io/download(这个连接可能得翻墙查看,但是在centos7服务器上安装过程不需要翻墙,我查看了最新的是redis-4.0.9.tar.gz ) ...

  9. actuator与spring-boot-admin 可以说的秘密

    SpringBoot 是为了简化 Spring 应用的创建.运行.调试.部署等一系列问题而诞生的产物,自动装配的特性让我们可以更好的关注业务本身而不是外部的XML配置,我们只需遵循规范,引入相关的依赖 ...

  10. 《Head First 设计模式》:观察者模式

    正文 一.定义 观察者模式定义了对象之间的一对多依赖,这样一来,当一个对象改变状态时,它的所有依赖者都会收到通知并自动更新. 要点: 观察者模式定义了对象之间一对多的关系. 观察者模式让主题(可观察者 ...