exlporer @ 2020-04-23 21:41:52
爆 0,均为
Wrong Answer. wrong answer Too long on line 1.
这是不是说我的结果对了但是多输出了什么东西?
我把题解的代码复制下来,把我的代码和题解代码分别编译,试了各种括号组合,将结果重定向输出到两个文件,用 diff
对比两个文件,完全一样
u0_a138@localhost:~/C++^master ±
% g++ P1241.cpp 20-04-23 - 21:28:11
u0_a138@localhost:~/C++^master ±
% g++ tmp.cpp -o b.out 20-04-23 - 21:34:23
tmp.cpp:17:13: warning: add explicit braces to avoid dangling else [-Wdangling-else]
else b[q[top--]]=' ';
^
1 warning generated.
u0_a138@localhost:~/C++^master ±
% ./b.out 20-04-23 - 21:34:30
][][[]())]]()][(][)
[][][[]()()][]()[][]()[][]()%
u0_a138@localhost:~/C++^master ±
% ./b.out > 2 20-04-23 - 21:34:51
][][[]())]]()][(][)
u0_a138@localhost:~/C++^master ±
% ./a.out 20-04-23 - 21:35:01
][][[]())]]()][(][)
[][][[]()()][]()[][]()[][]()%
u0_a138@localhost:~/C++^master ±
% ./a.out > 1 20-04-23 - 21:35:10
][][[]())]]()][(][)
u0_a138@localhost:~/C++^master ±
% diff 1 2 20-04-23 - 21:35:18
u0_a138@localhost:~/C++^master ±
%
下面是我的代码
/// P1241 括号序列
#include <iostream>
#include <stdio.h>
// 记录输入的括号, 本来想用栈但没用上
int stack[200];
// 记录是否已补全
bool ifC[200];
int k;
void push(char c){
// 从 1 开始存
stack[++k]=c;
}
// 用于生成补全对应的括号
char complete(char c){
if(c==']') return '[';
else if(c=='[') return ']';
else if(c==')') return '(';
else return ')';
}
void judge(){
// 从输入的第一个括号扫描到最后一个
for(int i=1,tmp,c;i<=k;++i){
// 如果是右括号
if(stack[i]==')' or stack[i]== ']'){
// 记录当前扫描的位置
tmp=i;
// 取得对应的左括号
c=complete(stack[i]);
// 从左边一个括号开始向左扫描
--tmp;
while(tmp>0){
// 打log
if(false){
for(int z=1;z<=k;++z){
printf("%d",ifC[z]);
}
std::cerr<<(char)stack[i]<<i<<'\n';
}
// 找到第一个左括号
if(stack[tmp]=='(' or stack[tmp]=='['){
// 如果还没有被补全过
if(ifC[tmp]==false){
// 如果匹配
if(c==stack[tmp]){
// 标记已匹配
ifC[i]=true;
ifC[tmp]=true;
}
// 停止寻找左括号
break;
}
}
// 匹配下一个右括号
--tmp;
}
}
}
}
char c[200];
int main(){
int i=0;
while(true){
scanf("%c",&c[++i]);
if(c[i]=='\n'){
--i;
break;
}else{
push(c[i]);
}
}
// 打log
if(false)
std::clog<<"i:"<<i<<std::endl;
judge();
// 输出
for(int j=1;j<=i;++j){
// 如果需要补全
if(ifC[j]!=true){
// 如果是左括号
if(stack[j]=='(' or stack[j]=='['){
printf("%c",stack[j]);
printf("%c",complete(stack[j]));
}else{
// 如果是右括号
printf("%c",complete(stack[j]));
printf("%c",stack[j]);
}
}else{
// 原样输出
printf("%c",stack[j]);
}
}
return 0;
}
by Thomas_Cat @ 2020-04-23 21:42:21
这里有人抄题解啊啊啊啊啊
by YUYGFGG @ 2020-04-23 21:44:44
@exlporer 硬 核 查 错
by 热言热语 @ 2020-04-23 21:47:45
借楼提问,为啥 Ubuntu 有时运行程序结尾会多显示一个百分号(像上面一样)?
by exlporer @ 2020-04-23 21:54:05
@热言热语 根据我的观察,可能是提醒你百分号以后的东西都不是程序输出的结果了。如果你在最后输出了换行符,就不会有百分号,否则的话就是百分号再自动换行
by Vocalise @ 2020-04-23 21:59:33
@热言热语 百分号就是zsh的特性罢,提醒你程序跑完了的
by 热言热语 @ 2020-04-23 22:02:04
@exlporer @void_basic_learner 谢谢两位 dalao