原题链接:CCF-CSP 202006-3 Markdown渲染器
写的下面这个代码就是奔着40分去的,结果呢,细节又没把握好,一直只有20分,找错的时候发现自己犯的两个错误:
1.如果一开头就有空格行,需要忽略,无需计数
2.如果一个段落中,前一行没有满w(假设w为10,前一行刚好9个字符),那么需要换到下一个行加字符,这时候就刚好满足了w,需要先存入,再讨论该行的情况
#include <bits/stdc++.h>
using namespace std;
const int N=510;
bool check(string s)
{
for(int i=0;i<s.size();i++)
{
if(s[i]!=' ') return false;
}
return true;
}
int main()
{
std::ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
int w; cin>>w;
int res=0;
cin.ignore();
string s,t;
vector<string> v;
int flag=0,len=0;
while(!cin.eof())
{
getline(cin,s);
if(check(s))
{
flag=1;
if(len>0) v.push_back(t);
len=0; t="";
continue;
}
if(flag && v.size()>0) v.push_back(" ");//错误点一
flag=0;
int i=0,j=s.size()-1;
while(i<=j && s[i]==' ') i++;
while(j>=0 && s[j]==' ') j--;
s=s.substr(i,j-i+1);
i=0;
if(len>0)
{
len++; t+=" ";
if(len==w)//错误点二
{
len=0;
res++;
v.push_back(t);
t="";
}
}
while( len<w )
{
for(;i<s.size() && len<w;i++)
{
len++;
t+=s[i];
}
if(len==w)
{
len=0;
res++;
v.push_back(t);
t="";
while(i<s.size() && s[i]==' ') i++;
}
if(i==s.size() ) break;
}
}
//for(auto tmp:v) cout<<tmp<<endl;
cout<<v.size();
return 0;
}
100分代码:
#include <bits/stdc++.h>
using namespace std;
#define ll long long
bool judge(string s)
{
for(int i=0;i<s.size();i++)
{
if(s[i]!=' ') return false;
}
return true;
}
void drop(string& s)
{
int i=0,j=s.size()-1;
while(i<s.size() && s[i]==' ') i++;
while(j>=0 && s[j]==' ') j--;
s=s.substr(i,j-i+1);
}
int main()
{
std::ios::sync_with_stdio(false);
std::cin.tie(0);
std::cout.tie(0);
int w; cin>>w;
string s,t;
vector<string> res;
int f=0,len=0;
while(!cin.eof())
{
getline(cin,s);
if(judge(s))
{
if(f!=0 && !judge(t)) res.push_back(t);
t=""; len=0; f=0;
}
else if((s.size()>=2 && s[0]=='*' && s[1]==' ') || (f==2 && s.size()>=2 && s[0]==' ' && s[1]==' '))
{
if(s.size()>=2 && s[0]=='*' && s[1]==' ')
{
if(f==0 && res.size()>0) res.push_back(" ");//空格
if(f==1)
{
if(!judge(t)) res.push_back(t);
res.push_back(" ");
}
if(f==2)
{
if(!judge(t)) res.push_back(t);
}
s=s.substr(2);
drop(s);
t=" . "; len=3;
int i=0;
while(len<w)
{
for(;i<s.size() && len<w;i++)
{
t+=s[i];
len++;
}
if(len==w)
{
res.push_back(t);
t=" ";
len=3;
}
while(i<s.size() && s[i]==' ') i++;
if(i==s.size()) break;
}
}
else if(f==2 && s.size()>=2 && s[0]==' ' && s[1]==' ')
{
if(len>0 && t!=" . ")
{
t+=" "; len++;
if(len==w)
{
res.push_back(t);
t=" "; len=3;
}
}
s=s.substr(2);
drop(s);
int i=0;
while(len<w)
{
for(;i<s.size() && len<w;i++)
{
t+=s[i];
len++;
}
if(len==w)
{
res.push_back(t);
t=" ";
len=3;
}
while(i<s.size() && s[i]==' ') i++;
if(i==s.size()) break;
}
}
f=2;
}
else
{
if(f==0 && res.size()>0) res.push_back(" ");
if(f==2 )
{
if(!judge(t)) res.push_back(t);
res.push_back(" ");
t=""; len=0;
}
if(t.size()>0)
{
t+=" "; len++;
if(len==w)
{
res.push_back(t);
t=""; len=0;
}
}
drop(s);
int i=0;
while(len<w)
{
for(;i<s.size() && len<w;i++)
{
t+=s[i];
len++;
}
if(len==w)
{
res.push_back(t);
t="";
len=0;
}
while(i<s.size() && s[i]==' ') i++;
if(i==s.size()) break;
}
f=1;
}
}
if(!judge(t)) res.push_back(t);//写代码要小心啊,这一句就是60和100的差距
//for(auto tmp: res) cout<<tmp<<endl;
cout<<res.size()<<endl;
return 0;
}