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