数据说列有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 ;
}