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 最详细的解题报告的更多相关文章
- OpenJudge 2775 文件结构“图”/ Poj 1057 FILE MAPPING
1.链接地址: http://bailian.openjudge.cn/practice/2775 http://poj.org/problem?id=1057 2.题目: 总时间限制: 1000ms ...
- POJ 1046 Color Me Less 最详细的解题报告
题目来源:POJ 1046 Color Me Less 题目大意:每一个颜色由R.G.B三部分组成,D=Math.sqrt(Math.pow((left.red - right.red), 2)+ M ...
- POJ 1063 Flip and Shift 最详细的解题报告
题目来源:Flip and Shift 题目大意:一个椭圆形的环形容器中有黑色和白色两种盘子,问你是否可以将黑色的盘子连续的放在一起.你可以有以下两种操作: 1.顺时针旋转所有的盘子 2.顺时针旋转3 ...
- POJ 1047 Round and Round We Go 最详细的解题报告
题目链接:Round and Round We Go 解题思路:用程序实现一个乘法功能,将给定的字符串依次做旋转,然后进行比较.由于题目比较简单,所以不做过多的详解. 具体算法(java版,可以直接A ...
- POJ 1050 To the Max 最详细的解题报告
题目来源:To the Max 题目大意:给定一个N*N的矩阵,求该矩阵中的某一个矩形,该矩形内各元素之和最大,即最大子矩阵问题. 解题方法:最大子序列之和的扩展 解题步骤: 1.定义一个N*N的矩阵 ...
- POJ 1095 Trees Made to Order 最详细的解题报告
题目来源:Trees Made to Order 题目大意:根据下面的规则给一棵二叉树编号: 规则1:如果二叉树为空,则编号为0: 规则2:如果二叉树只有一个节点,则编号为1: 规则3:所有含有m个节 ...
- poj 2739 Sum of Consecutive Prime Numbers 解题报告
题目链接:http://poj.org/problem?id=2739 预处理出所有10001以内的素数,按照递增顺序存入数组prime[1...total].然后依次处理每个测试数据.采用双重循环计 ...
- 广大暑假训练1(poj 2488) A Knight's Journey 解题报告
题目链接:http://vjudge.net/contest/view.action?cid=51369#problem/A (A - Children of the Candy Corn) ht ...
- [poj 2891] Strange Way to Express Integers 解题报告(excrt扩展中国剩余定理)
题目链接:http://poj.org/problem?id=2891 题目大意: 求解同余方程组,不保证模数互质 题解: 扩展中国剩余定理板子题 #include<algorithm> ...
随机推荐
- Looooops(求解同余方程、同余方程用法)【拓展欧几里得】
Looooops(点击) A Compiler Mystery: We are given a C-language style for loop of type for (variable = A; ...
- Python:三元表达式、列表推导式和生成器表达式
三元表达式 语法格式 如下: 为真时的结果 if 判断条件 else 为假时的结果 例子 name = input('姓名>>: ') res = '请进' if name == '张三' ...
- Node.js环境安装
为其他使用先小小的接触这个环境,如不出意外,未来的一些时候抽时间会系统的学习element-ui, JavaScript, vue, node.js, 稍后也做个简易的ACE Editor体验一下 1 ...
- 写一个通用的List集合导出excel的通用方法
前几天要做一个数据导出Excel 我就打算写一个通用的. 这样一来用的时候也方便,数据主要是通过Orm取的List.这样写一个通用的刚好. public static void ListToExcel ...
- python第三方库大全
环境管理 管理 Python 版本和环境的工具 p:非常简单的交互式 python 版本管理工具.官网 pyenv:简单的 Python 版本管理工具.官网 Vex:可以在虚拟环境中执行命令.官网 v ...
- log报错的原因解决
idea未装lombok的插件: 1.用快捷键Ctrl+Alt+S打开:Settings→Plugins→Browse repositories 2.输入lom后选择Install,安装插件 3.按照 ...
- 【解读】TCP三次握手和四次挥手
TCP有6种标识: 1.SYN(建立连接) 2.ACK(确认) 3.PSH(传送) 4.FIN(结束) 5.RST(重置) 6.URG(紧急) 一.TCP三次握手 第一次握手(发送:连接请求 ...
- ECSHOP 2.5.1 二次开发文档【文件结构说明和数据库表分析】
ecshop文件架构说明 /* ECShop 2.5.1 的结构图及各文件相应功能介绍 ECShop2.5.1_Beta upload 的目录 ┣ activity.php 活动列表 ┣ affich ...
- SSM框架出现500的错误解决办法
1,先确认pom.xml中有没有导入项目依赖, 2,发现导入之后还是报500.点击File->Project Structure->Artifacts 点击SSM右键,选择put int ...
- Canvas干货总结
一.canvas简介 <canvas> 是 html5 新增的,一个可以使用脚本(通常为 javascript) 在其中绘制图像的 html 元素.它可以用来制作照片集或者制作简单的动画 ...