UVA196Spreadsheet

来源:互联网 发布:linux 挂载硬盘 编辑:程序博客网 时间:2024/06/07 20:38

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]);        }    }}
0 0