P1928 外星密码题解
初看这题时,感觉就是一个简简单单的递归,便有了以下代码:
#include <bits/stdc++.h>
using namespace std;
string re(){
string s="",s1="";
char c;
int n;
while(cin>>c){
if(c=='['){
cin>>n;
s1=re();
while(n--)s+=s1;
}
else if(c==']')return s;
else s+=c;
}
}
int main(){
ios::sync_with_stdio(0);
cin.tie(0);cout.tie(0);
cout<<re();
return 0;
}
using namespace std;
string re(){
string s="",s1="";
char c;
int n;
while(cin>>c){
if(c=='['){
cin>>n;
s1=re();
while(n--)s+=s1;
}
else if(c==']')return s;
else s+=c;
}
}
int main(){
ios::sync_with_stdio(0);
cin.tie(0);cout.tie(0);
cout<<re();
return 0;
}
样例过了,自信提交,结果0分。。好吧,我们来看看数据点提示,RE。这时应该就要注意是数组越界还是有状态没考虑,自己造几组数据可知,若没有括号,则程序没有输出,产生死循环,于是略微修改,也是总算过了。。
正确代码:
#include <bits/stdc++.h>
using namespace std;
string re(){
string s="",s1="";
char c;
int n;
while(cin>>c){
if(c=='['){
cin>>n;
s1=re();
while(n--)s+=s1;
}
else if(c==']')return s;
else s+=c;
}
using namespace std;
string re(){
string s="",s1="";
char c;
int n;
while(cin>>c){
if(c=='['){
cin>>n;
s1=re();
while(n--)s+=s1;
}
else if(c==']')return s;
else s+=c;
}
return s;
}
int main(){
ios::sync_with_stdio(0);
cin.tie(0);cout.tie(0);
cout<<re();
return 0;
}
}
int main(){
ios::sync_with_stdio(0);
cin.tie(0);cout.tie(0);
cout<<re();
return 0;
}
总结:在打题时应先思考完所有的情况再下手,应该自己多造几个数据,手算一下边界条件。