uva196 Spreadsheet
2013-11-13 23:37
483 查看
数据说列有18278,实际数据不到1000。直接用递归。不知道为什么用字符串不过,改用string能过。我自己写的dfs不过,抄用别人的dfs能过。
过的代码
我不过的代码
另一个ac代码
为避免递归的栈溢出,我用了拓扑排序,让能直接算出的先算出,让包含其他缺数据的单元格的单元格后算,就不用多层递归了。以下是topo的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; //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 ; }
相关文章推荐
- UVA - 196 Spreadsheet
- uva 196 Spreadsheet
- UVA_196_Spreadsheet
- uva 196 - Spreadsheet
- UVa 196 Spreadsheet
- 【uva-196】Spreadsheet (拓扑排序)妈呀居然过了
- uva 196 Spreadsheet 拓扑排序 。坑爹的一题
- UVA 196 Spreadsheet
- UVa 196 Spreadsheet
- uva 196 - Spreadsheet
- UVA 196 - Spreadsheet
- UVA 196 Spreadsheet 解题报告
- UVA 196 & POJ 1420 Spreadsheet (DFS)
- uva196 - Spreadsheet(电子表格)
- uva 196 Spreadsheet(电子表格)
- uva 196 Spreadsheet(拓扑排序+DFS)
- UVa 196 - Spreadsheet
- UVA196-Spreadsheet(拓扑排序)
- uva 196 - Spreadsheet
- 196 - Spreadsheet//dfs