UVaOJ 196 - Spreadsheet

本文介绍了一种通过构建图模型解决大规模电子表格计算问题的方法。利用拓扑排序等算法实现单元格间依赖关系的正确计算顺序,针对1000×1000规模的数据集提出了一种高效的链表存储方案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


——by A Code Rabbit


Description

输入一张电子表格,请你把单元格填上的函数计算出来,填上数字输出。

函数的形式都是,其他单元格上的数字相加,并且保证没有求不出来的函数。


Types

Date Structure :: Graphs


Analysis

把单元格当作点,单元格之间的关系当作边,变成一张图。

这题的求解就变成了,去遍历一张图的每一个点,而函数单元格要在其参数走到之后才能走到。

所以拓扑排序,或者是暴力什么的,都可以。

但是要注意,虽然不知道测试数据怎么样,但是题目的数据规模有点吓人,是1000 * 1000的点。

如此多的点无法用一张邻接表来存储,需要把函数单元格映射到链表上,用链表来存储图的边。

这题的难点就是在输入表格的时候,如何用二维数组映射链表来存储(其实就是广义表)。

不过简单的地方就是,OJ上好似没有特别恶心的测试点(POJ上甚至明显WA的代码都可能AC)。


Solution

// UVaOJ 196
// Spreadsheet
// by A Code Rabbit

#include <cstdio>
#include <cstring>
#include <cctype>

const int LIMITS = 1234;
const int LIMITS_NODE = 1000000;

int t;

struct Cell {
    int value;
    int index;
};

Cell spreadsheet[LIMITS][LIMITS];
int n, m;

struct Node {
    int x;
    int y;
    int succ;
};

Node node[LIMITS_NODE];
int num_node;

bool IsLetter(char ch);
void Process(int x, int y, char* str);
int GetValue(int x, int y);

int main() {
    scanf("%d", &t);
    while (t--) {
        // INIT.
        num_node = 0;
        // Inputs.
        scanf("%d%d", &n, &m);
        getchar();
        for (int i = 1; i <= m; ++i) {
            for (int j = 1; j <= n; ++j) {
                char str[100];
                scanf("%s", str);
                Process(i, j, str);
            }
            getchar();
        }
        // Get the values of cells of the spreadsheet.
        for (int i = 1; i <= m; ++i) {
            for (int j = 1; j <= n; ++j) {
                if (spreadsheet[i][j].index != -1) {
                    GetValue(i, j);
                }
            }
        }
        // Outputs.
        for (int i = 1; i <= m; ++i) {
            for (int j = 1; j <= n - 1; ++j) {
                printf("%d ", spreadsheet[i][j].value);
            }
            printf("%d\n", spreadsheet[i][n]);
        }
    }

    return 0;
}

void Process(int x, int y, char* str) {
    if (str[0] != '=') {
        sscanf(str, "%d", &spreadsheet[x][y].value);
        spreadsheet[x][y].index = -1;
    } else {
        spreadsheet[x][y].index = num_node;
        int pos = 1;
        while (pos < strlen(str)) {
            if (isalnum(str[pos])) {
                Node& new_node = node[num_node];
                new_node.x = 0;
                new_node.y = 0;
                while (isalpha(str[pos])) {
                    new_node.y = new_node.y * 26 + str[pos] - 'A' + 1;
                    pos++;
                }
                while (isdigit(str[pos])) {
                    new_node.x = new_node.x * 10 + str[pos] - '0';
                    pos++;
                }
                
            }
            node[num_node].succ = num_node + 1;
            ++num_node;
            ++pos;
        }
        node[num_node - 1].succ = -1;
    }
}

int GetValue(int x, int y) {
    if (spreadsheet[x][y].index == -1) {
        return spreadsheet[x][y].value;
    } else {
        int sum = 0;
        int index = spreadsheet[x][y].index;
        while (index != -1) {
            sum += GetValue(node[index].x, node[index].y);
            index = node[index].succ;
        }
        spreadsheet[x][y].value = sum;
        spreadsheet[x][y].index = -1;
        return sum;
    }
}


下载PDF

参考资料:无


x-spreadsheet是一个开源的JavaScript电子表格库,允许开发者轻松地在网页应用中集成电子表格功能。它提供了类似Microsoft Excel或Google Sheets的界面和功能,使得用户可以在网页上进行数据输入、编辑和计算。 以下是x-spreadsheet的一些主要特点: 1. **易于集成**:通过简单的JavaScript代码即可将x-spreadsheet集成到任何网页应用中。 2. **功能丰富**:支持单元格编辑、公式计算、格式设置、数据验证、图表生成等。 3. **高度可定制**:开发者可以根据需求自定义样式、行为和功能。 4. **跨平台**:由于是基于JavaScript的库,x-spreadsheet可以在任何支持现代浏览器的平台上运行。 5. **开源**:x-spreadsheet是开源项目,开发者可以自由查看、修改和分发代码。 使用x-spreadsheet的基本步骤如下: 1. **引入库文件**:在HTML文件中引入x-spreadsheet的CSS和JavaScript文件。 2. **创建容器**:在HTML中创建一个容器元素,用于放置电子表格。 3. **初始化**:使用JavaScript初始化x-spreadsheet,并将其绑定到容器元素上。 以下是一个简单的示例代码: ```html <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>x-spreadsheet Example</title> <link rel="stylesheet" href="https://unpkg.com/x-data-spreadsheet/dist/xspreadsheet.css"> </head> <body> <div id="x-spreadsheet-demo"></div> <script src="https://unpkg.com/x-data-spreadsheet/dist/xspreadsheet.js"></script> <script> const data = [ ["Name", "Age", "City"], ["Alice", 25, "New York"], ["Bob", 30, "San Francisco"] ]; const options = {}; const spreadsheet = x.spreadsheet('#x-spreadsheet-demo', data, options); </script> </body> </html> ``` 通过以上代码,你可以在网页中创建一个简单的电子表格,并进行数据输入和编辑。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值