你玩過一個叫做”Kick Ass - Destroy the web”的遊戲嗎?如果你想玩的話請點擊此處
當然,你沒有玩過也沒關係,這個遊戲是通過js來加載一個飛船,讓你可以通過控制它發射子彈來摧毀網頁上的元素,從而獲得分數。
我們知道HTML是超文本標記語言,簡單地說就是通過一些標籤來指明元素的展示方式,比如
就可用作表明這是一個段落,表明這是一個區塊。假設有一個網頁只含有
、兩種標記,其中中只含有數字,摧毀
標記可獲得其中各個數字之和的分數,摧毀可獲得其中包含的所有分數與包含的分數二倍之和的分數。現在給你一個網頁,你能否計算出完全摧毀它可得到的分數。
爲了簡化難度,你可以假設:
所給網頁的字符只有數字和標籤
所給網頁的標籤都正確匹配
保證所給網頁中的數字都在
標籤內不會含有標籤 標籤內可能含有標籤和標籤 輸入 多組測試數據,請處理到文件結束。 每組佔一行,有一個長度不大於1000的字符串代表所給網頁。 輸出 請輸出完全摧毀此網頁可獲得的分數。 樣例輸入
123
123
樣例輸出
18
心理小活動:
/*
強調內容字符串中一開始進行遞歸時不是div就是p,若是p就直接算中間的數的和然後返回,
只有是div時纔會進入if()爲真的循環,而且若div是第一次出現那麼不會出現裏面的值乘二
起初這道題沒理解題意,以爲只要有數在div和/div之間就成二,
原來是摧毀 < div > < /div > 可獲得其中包含的所有 < p >< /p>分數與包含的< div>< /div>分數二倍之和的分數。
所以只有是div出現第二次及以上的時候纔會出現數的和乘二
*/
AC代碼:
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
char str[1010];
int dfs(int m,int &t,bool flag)
{
if(flag)
{
int sum=0;
while(true)
{
if(str[m]=='<'&&str[m+1]=='p'&&str[m+2]=='>')
sum+=dfs(m+3,m,false);
else if(str[m]=='<'&&str[m+1]=='d'&&str[m+2]=='i')
sum+=2*dfs(m+5,m,true);
else if(str[m]=='<'&&str[m+1]=='/'&&str[m+2]=='d')
{
t=m+6;
return sum;
}
}
}
else
{
int sum=0;
while(true)
{
if(str[m]>='0'&&str[m]<='9')
{
sum+=str[m]-'0';
}
else
{
t=m+4;
return sum;
}
m++;
}
}
}
int main()
{
while(~scanf("%s",str))
{
int l=strlen(str);
int res=0,i=0;
/*
字符串中一開始進行遞歸時不是div就是p,若是p就直接算中間的數的和然後返回,
只有是div時纔會進入if()爲真的循環,而且若div是第一次出現那麼不會出現裏面的值乘二
起初這道題沒理解題意,以爲只要有數在div和/div之間就成二,
原來是摧毀<div></div>可獲得其中包含的所有<p></p>分數與包含的<div></div>分數二倍之和的分數。
所以只有是div出現第二次及以上的時候纔會出現數的和乘二
*/
while(i<l)
{
if(str[i]=='<'&&str[i+1]=='p'&&str[i+2]=='>')
res+=dfs(i+3,i,false);
else res+=dfs(i+5,i,true);
}
printf("%d\n",res);
}
return 0;
}