您的位置:首页 > 其它

UVa 196 - Spreadsheet

2016-03-15 09:12 344 查看
題目:編寫一個剪刀的表格處理程序,表格中的數據有兩種情況:數字、其他表格數據的加和公式;

分析:記憶化搜索,字符串。利用記憶化搜索求解即可。

說明:數據1000x1000就夠了╮(╯▽╰)╭。

#include <algorithm>
#include <iostream>
#include <cstdlib>
#include <cstring>
#include <cstdio>

using namespace std;

const int oo = 0x80000000;

string sheet[1010][1010];
int value[1010][1010];

int dfs(int i, int j)
{
//记忆化搜索,已处理则直接返回
if (value[i][j] != oo)
return value[i][j];

//是数字,转化成整数
string str = sheet[i][j];
int ans = 0, len = str.length();
if (str[0] != '=') {
for (int k = 0; k < len; ++ k)
ans = ans*10 + str[k]-'0';
return value[i][j] = ans;
}

//组合形式,递归求解
int row = 0, column = 0;
for (int k = 1; k <= len; ++ k) {
if (str[k] >= '0' && str[k] <= '9') {
row = row*10 + str[k]-'0';
}else if (str[k] >= 'A' && str[k] <= 'Z') {
column = column*26 + str[k]-'A'+1;
}else {
ans += dfs(row, column);
row = column = 0;
}
}
return value[i][j] = ans;
}

int main()
{
int t, r, c;
while (cin >> t)
while (t --) {
cin >> c >> r;
for (int i = 1; i <= r; ++ i)
for (int j = 1; j <= c; ++ j) {
cin >> sheet[i][j];
value[i][j] = oo;
}

for (int i = 1; i <= r; ++ i)
for (int j = 1; j <= c; ++ j)
value[i][j] = dfs(i, j);

for (int i = 1; i <= r; ++ i) {
printf("%d",value[i][1]);
for (int j = 2; j <= c; ++ j)
printf(" %d",value[i][j]);
printf("\n");
}
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: