uva196 Spreadsheet

来源:互联网 发布:caffe可视化 编辑:程序博客网 时间:2024/05/22 03:28

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

过的代码

//#pragma comment(linker, "/STACK:102400000,102400000")#include <iostream>#include <cstring>#include<cstdio>#include<cstdlib>#include <string>#define MARK -2147483647using 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 -2147483647using 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 -2147483647using 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 ;}



 

原创粉丝点击