UVA 196 Spreadsheet

UVA-196

题意:给出一个N*M的矩阵,里面只有整数和公式两种内容。公式要通过它给出来的公式计算出这格的整数值。保证不会存在相互需要调用的情况。
解题思路:记忆化搜索。如果进来的格子算过了,直接返回计算后的值。否则的话,是数字就换算出来,然后返回。是公式把字母和数字分别求出来,把对应的内容加进去。

/*************************************************************************
    > File Name: UVA-196.cpp
    > Author: Narsh
    > 
    > Created Time: 2016年07月22日 星期五 14时37分43秒
 ************************************************************************/

#include <iostream>
#include <algorithm>
#include <cstdio>
#include <cstring>
using namespace std;
const int Max=0x80000000;
int val[1100][1100],n,m,t;
string w[1100][1100];
int dfs(int x, int y) {
    if (val[x][y] != Max) return val[x][y];
    int k =0,l = w[x][y].length();
    if (w[x][y][0] != '=') {
        for (int i = 0; i < l; i++)
            k=k*10 + w[x][y][i] - '0';
        return k;
    }
    int row = 0,column = 0;
    for (int i = 1; i <= l; i++) 
        if ('A' <= w[x][y][i] && w[x][y][i] <= 'Z') {
            column= column*26 +w[x][y][i]-'A'+1;
        }else if ('0' <= w[x][y][i] && w[x][y][i] <='9') {
            row=row*10+w[x][y][i]-'0';
        }else {
            k += dfs(row,column);
            row = column =0;
        }
    return k;
}
int main() {
    scanf("%d",&t);
    while (t--) {
        scanf("%d%d",&m,&n);
        for (int i = 1; i <= n; i++) 
            for (int j = 1; j <= m; j++) {
                cin>>w[i][j];
                val[i][j]=Max;
            }
        for(int i = 1; i <= n; i++)
            for (int j = 1; j <= m; j++)
                val[i][j]=dfs(i,j);
        for (int i = 1; i <= n; i++) {
            for (int j = 1; j < m; j++)
                printf("%d ",val[i][j]);
            printf("%d\n",val[i][m]);
        }
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值