uva196 Spreadsheet

数据说列有18278,实际数据不到1000。直接用递归。不知道为什么用字符串不过,改用string能过。我自己写的dfs不过,抄用别人的dfs能过。

过的代码

//#pragma comment(linker, "/STACK:102400000,102400000")
#include <iostream>
#include <cstring>
#include<cstdio>
#include<cstdlib>
#include <string>
#define MARK -2147483647
using namespace std;
int row,colu;
int biao[1010][1010];
//char formo[10100][100000];
string formo[1010][1010];
//int fori;
string ch;
//void make(int x,int y)
//{    ch=formo[x][y];
//    int cc=0,rr=0,l=ch.size();
//    int i,j;
//    int tian=0;
//    for(i=1;i<l;++i)
//    {
//        if(ch[i]>='A'&&ch[i]<='Z')
//        {
//           cc=ch[i]-'A'+1+cc*26;
//        }
//        if(ch[i]>='0'&&ch[i]<='9')
//        {
//            rr=ch[i]-'0'+rr*10;
//        }
//        if(ch[i]=='+')
//        {
//            if(biao[rr][cc]!=MARK)
//            {
//                tian=tian+biao[rr][cc];
//            }
//            else
//            {
//                make(rr,cc);
//                tian=tian+biao[rr][cc];
//            }
//            rr=0;cc=0;
//        }
//    }
//    if(biao[rr][cc]!=MARK)
//            {
//                tian=tian+biao[rr][cc];
//            }
//            else
//            {
//                make(rr,cc);
//                 tian=tian+biao[rr][cc];
//            }
//            biao[x][y]=tian;
// return;
//}
int dfs(int i,int j)
{   int row,col;
    if(biao[i][j]!=MARK) return biao[i][j];
    if(biao[i][j]==MARK)
    {
        biao[i][j]=row=col=0;
        string str=formo[i][j];
        for(int k=1; k<=str.size(); ++k)
            if(str[k]>='0'&&str[k]<='9') row=row*10+str[k]-'0';
            else if(str[k]>='A'&&str[k]<='Z') col=col*26+str[k]-'A'+1;
            else if(str[k]=='+'||k==str.size())
            {
                biao[i][j]+=dfs(row,col);
                row=col=0;
            }
        return biao[i][j];
    }
    return 0;
}
void print()
{
    int i,j;
    for(i=1;i<=row;++i)
    {
        for(j=1;j<=colu;++j)
        {  //printf("%d",biao[i][j]);
            if(biao[i][j]!=MARK)
            {   if(j==1)
                printf("%d",biao[i][j]);
                else
                    printf(" %d",biao[i][j]);
            }
            else
            {
                //make(i,j);
                dfs(i,j);
                if(j==1)
                printf("%d",biao[i][j]);
                else
                    printf(" %d",biao[i][j]);
            }
        }
        printf("\n");
    }
    return;
}
int main()
{
    freopen("in.txt","r",stdin);
    int t;
    scanf("%d",&t);
    while(t--)
    {
       scanf("%d%d",&colu,&row);
       int i,j;
       //fori=1;
       //memset(vis,0,sizeof(vis));
       for(i=1;i<=row;++i)
       {
           for(j=1;j<=colu;++j)
           {
              // scanf("%s",ch);
               cin>>ch;//cout<<ch<<endl;
               if(ch[0]=='=')
               {
                  // vis[i][j]=1;
                  biao[i][j]=MARK;
                   formo[i][j]=ch;
                   //strcpy(formo[fori],ch);
                //   puts(formo[fori]);
                  // fori++;
               }
               else
               {    int shu;
                   //int shu=0,l=ch.size(),fu=1;int ii;
//                   for(ii=0;ii<l;++ii)
//                   {
//                       if(ch[ii]=='-'){fu=0;continue; }
//                        shu=ch[ii]-'0'+shu*10;
//                   }
//                   if(!fu) shu=-shu;
                     shu=atoi(ch.c_str());//用上面的手写的字符串转换成数字也能过,但耗时多
                   biao[i][j]=shu;
                  // cout<<shu<<endl;
               }
           }
       }
       print();
    }

    return 0 ;
}


我不过的代码

//#pragma comment(linker, "/STACK:102400000,102400000")
#include <iostream>
#include <cstring>
#include<cstdio>
#include <queue>
using namespace std;
int row,colu;
int biao[1010][1010],vis[1010][1010];
char formo[10100][100000];
int fori;
char ch[10000000000];
void make(int x,int y)
{
    strcpy(ch,formo[vis[x][y]]);
    int cc=0,rr=0,l=strlen(ch);
    int i,j;//puts(ch);
    int tian=0;
    for(i=1;i<l;++i)
    {
        if(ch[i]>='A'&&ch[i]<='Z')
        {
           cc=ch[i]-'A'+1+cc*26;
        }
        if(ch[i]>='0'&&ch[i]<='9')
        {
            rr=ch[i]-'0'+rr*10;
        }
        if(ch[i]=='+')
        {
            if(!vis[rr][cc])
            {
                tian=tian+biao[rr][cc];
            }
            else
            {
                make(rr,cc);
                tian=tian+biao[rr][cc];
            }
            rr=0;cc=0;
        }
    }
    if(!vis[rr][cc])
            {
                tian=tian+biao[rr][cc];
            }
            else
            {
                make(rr,cc);
                 tian=tian+biao[rr][cc];
            }
            vis[x][y]=0;biao[x][y]=tian;

}
void print()
{
    int i,j;
    for(i=1;i<=row;++i)
    {
        for(j=1;j<=colu;++j)
        {  //printf("%d",biao[i][j]);
            if(!vis[i][j])
            {   if(j==1)
                printf("%d",biao[i][j]);
                else
                    printf(" %d",biao[i][j]);
            }
            else
            {
                make(i,j);
                if(j==1)
                printf("%d",biao[i][j]);
                else
                    printf(" %d",biao[i][j]);
            }
        }
        printf("\n");
    }
}
int main()
{
   // freopen("in.txt","r",stdin);
    int t;
    scanf("%d",&t);
    while(t--)
    {
       scanf("%d%d",&colu,&row);
       int i,j;
       fori=1;
       memset(vis,0,sizeof(vis));
       for(i=1;i<=row;++i)
       {
           for(j=1;j<=colu;++j)
           {
               scanf("%s",ch);
               if(ch[0]=='=')
               {
                   vis[i][j]=fori;
                   strcpy(formo[fori],ch);
                //   puts(formo[fori]);
                   fori++;
               }
               else
               {    int ii;
                   int shu=0,l=strlen(ch),fu=1;
                   for(ii=0;ii<l;++ii)
                   {
                       if(ch[ii]=='-'){fu=0;continue; }
                        shu=ch[ii]-'0'+shu*10;
                   }
                   if(!fu) shu=-shu;
                   biao[i][j]=shu;
                  // cout<<shu<<endl;
               }
           }
       }
       print();
    }

    return 0 ;
}

另一个ac代码

//#pragma comment(linker, "/STACK:102400000,102400000")
#include <iostream>
#include <cstring>
#include<cstdio>
#include<cstdlib>
#include <string>
#define MARK -2147483647
using namespace std;
int row,colu;
int biao[1010][1010];
//char formo[10100][100000];
string formo[1010][1010];
//int fori;
string ch;
int make(int x,int y)
{   if(biao[x][y]!=MARK)return biao[x][y];
     string chh=formo[x][y]; //此处用上面的全局变量ch老是re,改成局部后ac了,真不知道怎么回事。总的感觉可能减少递归函数的复杂度可能有利于规避栈溢出。
    int cc=0,rr=0,l=chh.size();biao[x][y]=0;
    int i,j;
    for(i=1;i<=l;++i)
    {
        if(chh[i]>='A'&&chh[i]<='Z'){cc=chh[i]-'A'+1+cc*26;}
       else if(chh[i]>='0'&&chh[i]<='9'){rr=chh[i]-'0'+rr*10;}
        else if(chh[i]=='+'||i==l){biao[x][y]+=make(rr,cc);rr=0;cc=0;}
    }
 return biao[x][y];
}
//int dfs(int i,int j)
//{   int row,col;
//    if(biao[i][j]!=MARK) return biao[i][j];
//    if(biao[i][j]==MARK)
//    {
//        biao[i][j]=row=col=0;
//        string str=formo[i][j];
//        for(int k=1; k<=str.size(); ++k)
//            if(str[k]>='0'&&str[k]<='9') row=row*10+str[k]-'0';
//            else if(str[k]>='A'&&str[k]<='Z') col=col*26+str[k]-'A'+1;
//            else if(str[k]=='+'||k==str.size())
//            {
//                biao[i][j]+=dfs(row,col);
//                row=col=0;
//            }
//        return biao[i][j];
//    }
//    return 0;
//}
void print()
{
    int i,j;
    for(i=1;i<=row;++i)
    {
        for(j=1;j<=colu;++j)
        {  //printf("%d",biao[i][j]);
            if(biao[i][j]!=MARK)
            {   if(j==1)
                printf("%d",biao[i][j]);
                else
                    printf(" %d",biao[i][j]);
            }
            else
            {
                make(i,j);
                //dfs(i,j);
                if(j==1)
                printf("%d",biao[i][j]);
                else
                    printf(" %d",biao[i][j]);
            }
        }
        printf("\n");
    }
    return;
}
int main()
{
   //freopen("in.txt","r",stdin);
    int t;
    scanf("%d",&t);
    while(t--)
    {
       scanf("%d%d",&colu,&row);
       int i,j;
       //fori=1;
       //memset(vis,0,sizeof(vis));
       for(i=1;i<=row;++i)
       {
           for(j=1;j<=colu;++j)
           {
              // scanf("%s",ch);
               cin>>ch;//cout<<ch<<endl;
               if(ch[0]=='=')
               {
                  // vis[i][j]=1;
                  biao[i][j]=MARK;
                   formo[i][j]=ch;
                   //strcpy(formo[fori],ch);
                //   puts(formo[fori]);
                  // fori++;
               }
               else
               {    int shu;
//                   int shu=0,l=ch.size(),fu=1;int ii;
//                   for(ii=0;ii<l;++ii)
//                   {
//                       if(ch[ii]=='-'){fu=0;continue; }
//                        shu=ch[ii]-'0'+shu*10;
//                   }
                   //if(!fu) shu=-shu;
                     shu=atoi(ch.c_str());
                   biao[i][j]=shu;
                  // cout<<shu<<endl;
               }
           }
       }
       print();
    }

    return 0 ;
}


为避免递归的栈溢出,我用了拓扑排序,让能直接算出的先算出,让包含其他缺数据的单元格的单元格后算,就不用多层递归了。以下是topo的ac代码

#include <iostream>
#include <cstring>
#include<cstdio>
#include<cstdlib>
#include <string>
#define MARK -2147483647
using namespace std;
int row,colu;
int biao[1010][1010];
string formo[1010][1010];
string ch;
struct node
{
    int x,y;
};
node q[1000100][2];int qi;
node js[1000100];int ji;
int vis[1010][1010];
void topo(node pai)
{ //cout<<qi;
    int i;
    for(i=0;i<qi;++i)
    {
        if(pai.x==q[i][0].x&&pai.y==q[i][0].y&&vis[q[i][1].x ][q[i][1].y ]==0)//此处可以用二分改进以减少时间复杂度。
        {
            topo(q[i][1]);
        }
    }
    vis[pai.x][pai.y]=1;
    js[ji++]=pai;//cout<<"d"<<ji;
return;
}
void make()
{
    int i;
    for(i=0;i<ji;++i)
    { int xx=js[i].x;int yy=js[i].y;
        if(biao[xx][yy]==MARK)
       {//cout<<xx<<" "<<yy<<endl;
           string chh=formo[xx][yy];
       int k,ll=chh.size();
       biao[xx][yy]=0;
                    int cc=0,rr=0;
                   for(k=1;k<=ll;++k)
                   {
                      if(chh[k]>='0'&&chh[k]<='9'){rr=rr*10+chh[k]-'0'; }
                       else if(chh[k]>='A'&&chh[k]<='Z'){cc=cc*26+chh[k]-'A'+1; }
                        else if(chh[k]=='+'||k==ll)
                        {
                            biao[xx][yy]+=biao[rr][cc];
                          //  cout<<biao[xx][yy]<<endl;
                            rr=0;cc=0;
                        }

                   }
       }
    }
    return;
}
int main()
{
   //freopen("in.txt","r",stdin);
    int t;
    scanf("%d",&t);
    while(t--)
    {   qi=0;ji=0;
       scanf("%d%d",&colu,&row);
       int i,j;
       //fori=1;
       memset(vis,0,sizeof(vis));
       for(i=1;i<=row;++i)
       {
           for(j=1;j<=colu;++j)
           {
               cin>>ch;
               if(ch[0]=='=')
               {
                  biao[i][j]=MARK;
                   formo[i][j]=ch;
                   int k,ll=ch.size();
                    int cc=0,rr=0;
                   for(k=1;k<=ll;++k)
                   {
                      if(ch[k]>='0'&&ch[k]<='9'){rr=rr*10+ch[k]-'0'; }
                       else if(ch[k]>='A'&&ch[k]<='Z'){cc=cc*26+ch[k]-'A'+1; }
                        else if(ch[k]=='+'||k==ll)
                        {
                            q[qi][0].x=i;q[qi][0].y=j;
                            q[qi][1].x=rr;q[qi][1].y=cc;
                            ++qi;

                            rr=cc=0;
                        }
                   }
               }
               else
               {
                   biao[i][j]=atoi(ch.c_str());
               }
           }

       }

//       {
//           cout<<q[i][0].x<<" "<<q[i][0].y<<" a";
//          cout<<q[i][1].x<<" "<<q[i][1].y<<endl;
//       }
       //topo(q[i][0]);
       for(i=0;i<qi;++i)
       {if(!vis[q[i][0].x ][q[i][0].y ]) topo(q[i][0]);}
      // cout<<qi<<endl;
      make();
 //for(i=0;i<ji;++i)cout<<js[i].x<<" "<<js[i].y<<endl;
       for(i=1;i<=row;++i)
       {
           for(j=1;j<colu;++j)
           {
               printf("%d ",biao[i][j]);
           }printf("%d\n",biao[i][j]);
       }

    }

    return 0 ;
}



 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值