uva297紫书解为何不wa

那天非常久没有ac题目,可是找不到紫书水题了,就抄紫书,结果是wa。
第一次提交的代码,边看紫书边抄的代码

#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
const int maxn=32;
bool mp[32][32];
char lett[1034];//这个代码是wa的,但是如果将这里改为lett[2500],就ac了
int cnt;
void draw(const char*s,int& p,int r,int c,int w)
{
    char ch=s[p++];
    if(ch=='p')
    {
        draw(s,p,r,    c+w/2,w/2);
        draw(s,p,r,    c,    w/2);
        draw(s,p,r+w/2,c,    w/2);
        draw(s,p,r+w/2,c+w/2,w/2);
    }
    if(ch=='f')
    {
        for(int i=r;i<r+w;i++)
            for(int d=c;d<c+w;d++)
        if(mp[i][d]==0){mp[i][d]=1;cnt++;}

    }
}
int main(void)
{int cas;
    scanf("%d",&cas);
    while(cas--)
    {
        memset(mp,0,sizeof(mp));
        cnt=0;
        scanf("%s",lett);
        int p=0;
        draw(lett,p,0,0,32);

        p=0;
        scanf("%s",lett);
        draw(lett,p,0,0,32);
         printf("There are %d black pixels.\n",cnt);
    }
return 0;
}

又照着紫书一个字一个字地改,还是wa,绝望。
过了4天,玩了几天回过头重写,自己写,wa了一次,直接复制网上代码,和以前自己抄紫书的感觉没区别的代码,居然ac了,再回头看刚提交的代码为什么wa,原来是自己没按格式输出答案,改了就ac了。
然后比较自己写的代码,和原来抄紫书的代码区别,就是字符串开的大小,紫书开了1024,而自己开的是10242+10,于是改了第一次的代码,居然就过了,所以我感到很神奇的是紫书的代码是怎么过的,网上和我第一次提交的几乎一模一样的代码是怎么过的,为什么网上代码用10242+10就能过,而我要用1024*2+1才能过?

自己写的ac代码

#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
int p,cnt;
bool mp[33][33];
void draw(char*s,int r,int c,int w)
{p++;
    if(s[p]=='p')
    {
        draw(s,r,    c+w/2,w/2);
        draw(s,r,    c,    w/2);
        draw(s,r+w/2,c,    w/2);
        draw(s,r+w/2,c+w/2,w/2);
        return ;
    }
     if(s[p]=='f')
    {
        for(int i=r;i<(r+w);i++)
        for(int d=c;d<(c+w);d++)
        if(mp[i][d]==0){cnt++;mp[i][d]=1;}
}
}
int main(void)
{int cas;
  scanf("%d",&cas);
  char s[2049];
  while(cas--)
  { cnt=0;
  memset(mp,0,sizeof(mp));
      for(int i=1;i<=2;i++){
    scanf("%s",s);
     p=-1;
    draw(s,0,0,32);
  }
  printf("There are %d black pixels.\n",cnt);
}
return 0;}

网上复制的ac代码

#include <iostream>
#include <string.h>
#include <stdio.h>
using namespace std;
const int len = 32;
const int maxn = 1024 + 10;
char s[maxn];
bool buf[len][len];
int cot;
void draw(char*s,int&p,int r, int c, int w){
    char ch = s[p++];
    if(ch == 'p'){
        draw(s, p, r    , c+w/2, w/2);
        draw(s, p, r    , c    , w/2);
        draw(s, p, r+w/2, c    , w/2);
        draw(s, p, r+w/2, c+w/2, w/2);
    }
    else if(ch == 'f'){
        for(int i=r;i<r+w;i++)
            for(int j=c;j<c+w;j++)
                if(buf[i][j] == 0) {buf[i][j] = 1;cot++;}
    }
}
int main()
{
    int cas;
    scanf("%d",&cas);
    while(cas--){
        memset(buf,0,sizeof(buf));
        cot = 0;
        for(int i=0;i<2;i++){
            scanf("%s",s);
            int p=0;
            draw(s,p,0,0,len);
        }
        printf("There are %d black pixels.\n",cot);
    }
    return 0;
}

猜你喜欢

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