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 ;}
- uva196 Spreadsheet
- uva196 - Spreadsheet(电子表格)
- uva196
- uva196
- uva196
- UVA196拓扑排序形式的搜索
- Spreadsheet::ParseExcel
- 196 - Spreadsheet
- 控件---spreadsheet
- Spreadsheet Tracking
- Spreadsheet Tracking
- Spreadsheet::ParseExcel
- CF1B Spreadsheet
- Spreadsheet Tracking
- Spreadsheet Tracking
- XML Spreadsheet Reference
- javascript:SpreadSheet.js
- spreadsheet js 控件
- android图片切换ImageSwichter的动画切换效果
- 最小步数(广搜)
- java的关于流程结构做的几个案例
- 根文件系统制作的lib库必须添加的文件
- 代理模式
- uva196 Spreadsheet
- 目录操作,mac os 16-5
- SQL Server 2008R2数据库文件导入到SQL Server 2008数据库中
- linux 根文件系统制作
- 笔记本合上以后不关闭外接显示器
- [hadoop eclipse]编译hadoop1.x的插件简明教程
- 搜索介绍
- Android数据存储访问——文件存储
- Oracle Sql根据不同取值选择不同的表