您的位置:首页 > 其它

uva196 Spreadsheet

2013-11-13 23:37 483 查看
数据说列有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 ;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: