UVa OJ 196

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;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值