ccf-20170303--Markdown

我的想法如下图:

代码和题目如下:

问题描述

试题编号: 201703-3
试题名称: Markdown
时间限制: 1.0s
内存限制: 256.0MB
问题描述:
问题描述
  Markdown 是一种很流行的轻量级标记语言(lightweight markup language),广泛用于撰写带格式的文档。例如以下这段文本就是用 Markdown 的语法写成的:



  这些用 Markdown 写成的文本,尽管本身是纯文本格式,然而读者可以很容易地看出它的文档结构。同时,还有很多工具可以自动把 Markdown 文本转换成 HTML 甚至 Word、PDF 等格式,取得更好的排版效果。例如上面这段文本通过转化得到的 HTML 代码如下所示:



  本题要求由你来编写一个 Markdown 的转换工具,完成 Markdown 文本到 HTML 代码的转换工作。简化起见,本题定义的 Markdown 语法规则和转换规则描述如下:
  ●区块:区块是文档的顶级结构。本题的 Markdown 语法有 3 种区块格式。在输入中,相邻两个区块之间用一个或多个空行分隔。输出时删除所有分隔区块的空行。
  ○段落:一般情况下,连续多行输入构成一个段落。段落的转换规则是在段落的第一行行首插入 `<p>`,在最后一行行末插入 `</p>`。
  ○标题:每个标题区块只有一行,由若干个 `#` 开头,接着一个或多个空格,然后是标题内容,直到行末。`#` 的个数决定了标题的等级。转换时,`# Heading` 转换为 `<h1>Heading</h1>`,`## Heading` 转换为 `<h2>Heading</h2>`,以此类推。标题等级最深为 6。
  ○无序列表:无序列表由若干行组成,每行由 `*` 开头,接着一个或多个空格,然后是列表项目的文字,直到行末。转换时,在最开始插入一行 `<ul>`,最后插入一行 `</ul>`;对于每行,`* Item` 转换为 `<li>Item</li>`。本题中的无序列表只有一层,不会出现缩进的情况。
  ●行内:对于区块中的内容,有以下两种行内结构。
  ○强调:`_Text_` 转换为 `<em>Text</em>`。强调不会出现嵌套,每行中 `_` 的个数一定是偶数,且不会连续相邻。注意 `_Text_` 的前后不一定是空格字符。
  ○超级链接:`[Text](Link)` 转换为 `<a href="Link">Text</a>`。超级链接和强调可以相互嵌套,但每种格式不会超过一层。
输入格式
  输入由若干行组成,表示一个用本题规定的 Markdown 语法撰写的文档。
输出格式
  输出由若干行组成,表示输入的 Markdown 文档转换成产生的 HTML 代码。
样例输入
# Hello

Hello, world!
样例输出
<h1>Hello</h1>
<p>Hello, world!</p>
评测用例规模与约定
  本题的测试点满足以下条件:
  ●本题每个测试点的输入数据所包含的行数都不超过100,每行字符的个数(包括行末换行符)都不超过100。
  ●除了换行符之外,所有字符都是 ASCII 码 32 至 126 的可打印字符。
  ●每行行首和行末都不会出现空格字符。
  ●输入数据除了 Markdown 语法所需,内容中不会出现 `#`、`*`、`_`、`[`、`]`、`(`、`)`、`<`、`>`、`&` 这些字符。
  ●所有测试点均符合题目所规定的 Markdown 语法,你的程序不需要考虑语法错误的情况。
  每个测试点包含的语法规则如下表所示,其中“√”表示包含,“×”表示不包含。
测试点编号 段落 标题 无序列表 强调 超级链接
1 × × × ×
2 × × ×
3 × × ×
4 × × ×
5 × × ×
6 × ×
7 × ×
8 × ×
9 × ×
10
提示
  由于本题要将输入数据当做一个文本文件来处理,要逐行读取直到文件结束,C/C++、Java 语言的用户可以参考以下代码片段来读取输入内容。


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
#include<bits/stdc++.h>
using namespace std;
string Int_to_String(int n){
    stringstream ss;
    ss<<n;
    return ss.str();
}
void Operator_Spec(string & s){
    int flagEm=0;
    int index;
    while((index=s.find('_'))!=string::npos){
        if(flagEm==0){
            s.replace(index,1,"<em>");
            flagEm=1;
        }else{
            s.replace(index,1,"</em>");
            flagEm=0;
        }
    }
    while(s.find("[")!=string::npos&&s.find("]")!=string::npos&&s.find("(")!=string::npos&&s.find(")")!=string::npos){
        string text="",link="";
        text=s.substr(s.find("[")+1,s.find("]")-s.find("[")-1);
        link=s.substr(s.find("(")+1,s.find(")")-s.find("(")-1);
        //<a href="Link">Text</a>
        string href="<a href=\""+link+"\">"+text+"</a>";
        s.replace(s.find("["),s.find(")")-s.find("[")+1,href);
    }
}
int main(){
    string temps="";
    int flagUl=0;//标记是否出现ul例如列表
    int flagP=0;//用于标记p段落
    string result="";
    string Total_Result="";
    while(getline(cin,temps)){
        if(temps!=""){
            if(temps[0]=='#'){
                int headerCount=0;
                int i=0;
                while(temps[i]=='#'){
                    i++;
                }
                headerCount=i;
                result="<h"+Int_to_String(headerCount)+">";
                while(temps[i]==' '){
                    i++;
                }
                result=result+temps.substr(i,temps.length()-i);
                result+="</h"+Int_to_String(headerCount)+">";
            }else if(temps[0]=='*'){
                if(flagUl==0){
                    result+="<ul>\n";
                    flagUl=1;
                }
                int i=1;
                while(temps[i]==' '){
                    i++;
                }
                result=result+"<li>"+temps.substr(i,temps.length()-i)+"</li>"+"\n";
            }else{
                //cout<<"flagP:"<<flagP<<endl;
                if(flagP==0){
                    result+="<p>";
                    flagP=1;
                }
                result+=temps+"\n";
            }
        }else{
            if(flagUl==0&&flagP==0){
                Operator_Spec(result);
                //Total_Result+=result;
                cout<<result<<endl;
                result="";
            }else{
                if(flagUl==1){
                    Operator_Spec(result);
                    //Total_Result=Total_Result+result+"</ul>";
                    cout<<result<<"</ul>"<<endl;
                    flagUl=0;
                    result="";
                }
                if(flagP==1){
                    result=result.substr(0,result.length()-1);
                    Operator_Spec(result);
                    //Total_Result=Total_Result+result+"</p>";
                    cout<<result+"</p>"<<endl;
                    flagP=0;
                    result="";
                }  
            }
        }
    //  temps="";
    }
    if(temps!=""){//最后还会遗留一个区块,不能忽略这种情况
            if(temps[0]=='#'){
                int headerCount=0;
                int i=0;
                while(temps[i]=='#'){
                    i++;
                }
                headerCount=i;
                result="<h"+Int_to_String(headerCount)+">";
                while(temps[i]==' '){
                    i++;
                }
                result=result+temps.substr(i,temps.length()-i);
                result+="</h"+Int_to_String(headerCount)+">";
            }else if(temps[0]=='*'){
                if(flagUl==0){
                    result+="<ul>\n";
                    flagUl=1;
                }
                int i=1;
                while(temps[i]==' '){
                    i++;
                }
                result=result+"<li>"+temps.substr(i,temps.length()-i)+"</li>"+"\n";
            }else{
                //cout<<"flagP:"<<flagP<<endl;
                if(flagP==0){
                    result+="<p>";
                    flagP=1;
                }
                result+=temps+"\n";
            }
        }else{
            if(flagUl==0&&flagP==0){
                Operator_Spec(result);
                //Total_Result+=result;
                cout<<result<<endl;
                result="";
            }else{
                if(flagUl==1){
                    Operator_Spec(result);
                    //Total_Result=Total_Result+result+"</ul>";
                    cout<<result<<"</ul>"<<endl;
                    flagUl=0;
                    result="";
                }
                if(flagP==1){
                    result=result.substr(0,result.length()-1);
                    Operator_Spec(result);
                    //Total_Result=Total_Result+result+"</p>";
                    cout<<result+"</p>"<<endl;
                    flagP=0;
                    result="";
                }  
            }
        }
    //cin.get();
    //cout<<Total_Result<<endl;
    return 0;
}

  

posted @   张杨  阅读(491)  评论(0编辑  收藏  举报
编辑推荐:
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
· 25岁的心里话
历史上的今天:
2016-03-07 利用链表来实现对员工信息的存储,排序,删除,插入
点击右上角即可分享
微信分享提示