uva10562 紫书代码不能过udebug

这题真是让我尝到了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<cstdio>
#include<algorithm>
#include<cstring>
#include<string>
#include<iostream>
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<mp[r-1].size();i++)if(mp[r-1][i]!='-')break;en=i;
    }
    printf("(");
    for(i=qi;i<en;i++)
    {
        if(jud(mp[r][i]))
         {
             printf("%c",mp[r][i]);
        if(mp[r+1][i]=='|')done(r+3,i,tot);
        else printf("()");}
    }
    printf(")");
}
int main(void)
{//freopen("123.txt","r",stdin);
//freopen("abc.txt","w",stdout);
    int cas,i;
    scanf("%d",&cas);
    getchar();
    while(cas--)
    {
        for(i=1;;i++)
        {
            getline(cin,mp[i]);
            if(mp[i]=="#")break;
        }
        int tot=i;
        if(i==1){printf("()\n");continue;}
        done(1,0,tot);
        printf("\n");
        for(i=1;i<=tot;i++)mp[i].clear();
    }
}


ac代码

#include<cstdio>
#include<cstring>
#include<cctype>
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<n&&buf[r+1][c]=='|')
    {
        int i=c;
        while(i-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<strlen(buf[0]);i++)
        if(buf[0][i]!=' '){dfs(0,i);break;}
           }
 printf(")\n");

}
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;
}

从中学到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)

猜你喜欢

转载自blog.csdn.net/qq_43235540/article/details/86700657