天天看點

CCF認證 201703-3 Markdown (100分)

CCF認證 201703-3 Markdown

思路:還是參考了一下大佬的 ,感覺很難處理的地方就是段落問題,p。

問題描述

  Markdown 是一種很流行的輕量級标記語言(lightweight markup language),廣泛用于撰寫帶格式的文檔。例如以下這段文本就是用 Markdown 的文法寫成的:

CCF認證 201703-3 Markdown (100分)

  這些用 Markdown 寫成的文本,盡管本身是純文字格式,然而讀者可以很容易地看出它的文檔結構。同時,還有很多工具可以自動把 Markdown 文本轉換成 HTML 甚至 Word、PDF 等格式,取得更好的排版效果。例如上面這段文本通過轉化得到的 HTML 代碼如下所示:

CCF認證 201703-3 Markdown (100分)

  本題要求由你來編寫一個 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

提示

#include<iostream>
#include<cstdio>
#include<cstring>
//好可怕寫不下去了emmm 
using namespace std;
const int maxn=100+10;
string ans[maxn];
int main()
{
  string str;
  int uf=0,pf=0;//無序清單  段落
  int tot=0;
  for(int i=0;i<maxn;i++) ans[i]="";
  while(getline(cin,str))
  {//輸入每個區塊有多個空行 
    //區塊 <p></p>   <h1></h1>  <ul></ul>
    //行内 強調 超連結
    int len=str.size();
    if(len==0)
    {
      if(uf)
      {
        ans[tot]+="</ul>";
        tot++;
        uf=0;
      }
      if(pf)
      {
        ans[tot-1]+="</p>";
        pf=0;
      }
    }
    else if(str[0]=='#')
    {
      int cnt=0;
      while(str[0]=='#') str.erase(0,1),cnt++;
      while(str[0]==' ') str.erase(0,1);
      ans[tot]+="<h";ans[tot]+='0'+cnt;ans[tot]+=">";ans[tot]+=str;
      ans[tot]+="</h";ans[tot]+='0'+cnt;ans[tot]+=">";
      tot++;
    }
    else if(str[0]=='*')
    {
      if(!uf)
      {
        uf=1;
        ans[tot]+="<ul>";tot++;
      }
      str.erase(0,1);
      while(str[0]==' ') str.erase(0,1);
      ans[tot]+="<li>";
      ans[tot]+=str;
      ans[tot]+="</li>";
      tot++;
    }
    else
    {
      if(!pf)
      {
        ans[tot]+="<p>";
        pf=1;
      }
      ans[tot]+=str;
      tot++;
    }
  }
  if(uf)
  {
    ans[tot]+="</ul>";
    tot++;
    uf=0;
  }
  if(pf)
  {
    ans[tot-1]+="</p>";
    pf=0;
  }//處理到這裡四十分 --- 
  //cout<<tot<<endl;
  //開始處理強調和超連結
  for(int i=0;i<tot;i++)
  {
    int len=ans[i].size();
    for(int j=0;j<len;j++)
    {
      if(ans[i][j]=='_')
      {
        string tmp="";
        ans[i].erase(j,1);
        while(ans[i][j]!='_')  tmp+=ans[i][j],ans[i].erase(j,1);
        ans[i].erase(j,1);
        ans[i].insert(j,"</em>");
        ans[i].insert(j,tmp);
        ans[i].insert(j,"<em>");
      }
      if(ans[i][j]=='[')
      {//[Text](Link)   <a href="Link">Text</a>
        string text="",link="<a href=\"",tmp="";
        ans[i].erase(j,1);
        while(ans[i][j]!=']') text+=ans[i][j],ans[i].erase(j,1);
        ans[i].erase(j,1);
        //while(ans[i][j]!='(') tmp+=ams[i][j],ans[i].erase(j,1);
        ans[i].erase(j,1);
        while(ans[i][j]!=')') link+=ans[i][j],ans[i].erase(j,1);
        ans[i].erase(j,1);
        link+="\">";
        
        ans[i].insert(j,"</a>");
        ans[i].insert(j,text);
        ans[i].insert(j,link);
      }
    }
  } 
  for(int i=0;i<tot;i++)
    cout<<ans[i]<<endl;
  return 0;
}