这题真是让我尝到了wa的绝望。
3天前晚上,看这题还蛮简单,
2天前中午开始敲代码,写了3hour,一直wa,应该是代码不清晰,冷静一会儿,重写,写完wa,一直改,debug过了,可是依然wa,改到晚上12点,依然wa,wa到绝望,如此废柴怎么入队,555~~
1天前上午依然试图改,改了仍然wa,恰巧去写了另外一个题目,很简单的bfs题目也wa了,绝望了,一点也不想碰oj了。
1天前下午外面瞎逛了回来,不行呀,写oj是真的只为了和别人比吗,是情怀呀,代码是那么神奇的东西,可以做出那么多意向不到的事情,又想起学长的那句“十年一觉ac梦,赢得oj薄幸名”。
1天前晚上好,看紫书上的代码,虽然我之前对照过,我觉得很奇怪,题目说node不可以是’#‘,可是它却可以。 但是现在不能这么拖下去了,我照着代码抄,当然了,有很多风格不适应,所以,我就小改了。提交了,等了好一会儿,wa~~ 对照,没有抄错呀,md,一不做二不休,网上找了一个博客,感觉做法和紫书很相似的,一不做二不休,直接复制粘贴,不管了,睡觉。
今天 一早醒来,wa,痛彻心扉,感觉我的账号这辈子都不可能ac了,但可能是昨天睡觉前和学长聊了一下,心态更稳了。wa了这么多,无所谓了,再复制了一个博客,居然ac了。奇了怪了,对照抄紫书的代码,把自己小改的部分,再验证了一遍,发现自己小改还真的就改错了。
//改之前
for(; ;)
{
fgets(str[n],max,stdin);
if(str[n][0]=='#')
break;
else
n++;
}
//改之后
for(n=0;;n++)
{fgets(buf[n],maxn,stdin);
if(buf[n][0]=='#')break;
}
n=n-1;
此外,自己在测验代码时,忘记删了和cin组合的getchar();
int main(void)
{//freopen("123.txt","r",stdin);
//freopen("abc.txt","w",stdout);
int cas;
fgets(buf[0],maxn,stdin);
sscanf(buf[0],"%d",&cas);
//scanf("%d",&cas);
getchar();
while(cas--)solve();
return 0;
}
再看那个抄的博客代码却wa的
https://blog.csdn.net/sxy201658506207/article/details/79565691
//它错在用了2个输入,如果它用了fgets 和sscanf 就不要用cin和getchar;
int main()
{//freopen("123.txt","r",stdin);
//freopen("abc.txt","w",stdin);
int t;
fgets(str[0],max,stdin);
sscanf(str[0],"%d",&t);
cin>>t;
getchar();
while(t--)
solve();
return 0;
}
检查ac代码,还真是node可以为’#‘,于是把ac代码用uDebug去测,真没有过,就是错在这个node不可以为’#‘。
1
A
#|#
---
#B#
#
udebug的答案是 (A(B()))
而ac代码的答案是 (A(#()B()#()))
5555~~要哭了,自己原来是对的,可是所有人都默认跳过了这个题目,
题目里说“The labels of each of node can be any printable character except for the symbols ‘-’, ‘|’, ‘ ’(space) and ‘#’.
能通过udebug样例的代码,却非ac的代码,求dl指教
#include
#include
#include
#include
#include
using namespace std;
string mp[210];
bool jud(char c){return c!='|'&&c!='#'&&c!='-'&&c!=' '&&c!='\n'&&c!='\0';}
void done(int r,int c,int tot)
{int i;
//sure range
int qi,en;
if(r==1){ qi=0; en=mp[1].size();}
else{
for(i=c;i>=0;i--)
if(mp[r-1][i]!='-')break;
if(i==-1&&mp[r-1][0]=='-')qi=0;else qi=i+1;
for(i=c;i
ac代码
#include
#include
#include
using namespace std;
const int maxn=200+10;
int n;
char buf[maxn][maxn];
void dfs(int r,int c)
{
printf("%c(",buf[r][c]);
if(r+1=0&&buf[r+2][i-1]=='-')i--;
while(buf[r+2][i]=='-'&&buf[r+3][i]!='\0')
{
if(!isspace(buf[r+3][i]))dfs(r+3,i);
i++;
}
}
printf(")");
}
void solve()
{
for(n=0;;n++)
{fgets(buf[n],maxn,stdin);
if(buf[n][0]=='#')break;
}
printf("(");
if(n)
{
for(int i=0;i
从中学到fgets用法,
1.fgets(储存地址,读取长度,读取文件);
例如代码中 fgets(buf[0],maxn,stdin);
fgets对应字符数组,如果有输入’\n’,它的倒数第二位是’\n’,倒数第一位是‘\0’; getline对应string,它不会读入’\n’,它的最后一位会是’\0’;
2.sspace用法
检查参数c是否为空格字符,也就是判断是否为空格(’ ‘)、水平定位字符
(’\t’)、归位键(’\r’)、换行(’\n’)、垂直定位字符(’\v’)或翻页(’\f’)的情况。
若参数c为空格字符,则返回TRUE,否则返回NULL(0)