1、好题啊~涉及的知识点很多,要吐槽一下的就是题目比较吓人,列最多达到ZZZ,那数组可能有18000列!怎么想都RE吧~看了别人的题解,发现只要开到1010就可以了,这题目,纯粹是忽悠人。。。
2、其实用DFS就可以做了,有人说用拓扑排序,大同小异,拓扑排序也是dfs啊,而且本题不可能有环,也就是不可能有互相调用的两个格子,所以放心dfs。采用记忆化搜索可以提高时间效率。
3、本题还用了atoi函数,还用了string类(真方便),还用了结构体来表示每个格子,总之各种方便~
4、一个教训就是我刚开始把字母化为数字的时候,以为A是0,B是1,结果一直RE,后来我想可不是嘛,如果这样的话,那AAA还是0,就和A冲突了,这样乱七八糟地搞混,当然很容易交错访问,继而RE了。其实A是1,Z是26,那AA就是27~这点和十进制又不太一样,真的很微妙。
5、还有就是预处理,在字符串后加个“+”,以“+”为处理的标志,很巧妙。注意每次处理后,trow,tcol都要归零。
6、至此,数据结构部分结束。
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cctype>
#include<cstring>
using namespace std;
typedef struct{
bool type;
string s;
int num;
}table;
table a[1010][1010];
int dfs(int i,int j){
if(a[i][j].type) return a[i][j].num;
int trow=0,tcol=0,p=0;
for(int p=0;p<a[i][j].s.size();p++){
if(isdigit(a[i][j].s[p])) trow=trow*10+a[i][j].s[p]-'0';
else if(isalpha(a[i][j].s[p])) tcol=tcol*26+a[i][j].s[p]-'A'+1;
else if(a[i][j].s[p]=='+'){a[i][j].num+=dfs(trow-1,tcol-1);trow=0;tcol=0;}
}
a[i][j].type=true;
return a[i][j].num;
}
int main(){
int T,col,row;
scanf("%d",&T);
while(T--){
scanf("%d%d",&col,&row);
for(int i=0;i<row;i++)
for(int j=0;j<col;j++){
cin>>a[i][j].s;
if(a[i][j].s[0]=='='){
a[i][j].type=false;
a[i][j].num=0;
a[i][j].s+="+";
}
else{
a[i][j].type=true;
a[i][j].num=atoi(a[i][j].s.c_str());
}
}
for(int i=0;i<row;i++){
for(int j=0;j<col;j++){
printf("%d",dfs(i,j));
if(j!=col-1) printf(" ");
}
printf("\n");
}
}
return 0;
}