您的位置:首页 > 其它

UVA 196 Spreadsheet

2016-07-23 15:31 316 查看

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]);
}
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: