UVa512追踪电子表格中的单元格详解

解题思路:

因为我们最终要查找的是一开始的那些单元格的最终的位置,所以每次变换后,我们只记录更新这些单元格的位置

1、注意的地方:如:实施删除操作时,如果删除多行,指的是在同一个表格上同时进行删除这几行

2、比如说删除行操作,为了减少存储,输入一个删除第几行时,对每个单元格应当变化的数量进行更改并将要删除的该行的单元格的参数进行调整

,输入最后一个删除第几行时,将所有单元格对应的位置根据其变化数进行更改

该题起笔比较草率,所以很多细节没有考虑到,以至于后面debug很多次

#include<iostream>
#include<String>
#include<stdlib.h>
using namespace std;
struct
{
    int dx;//记录每次变换后的坐标信息
    int dy;
    int n;//记录每种操作过后坐标改变的数量值
}cell[51][51];
int M, N;
void init(int m, int n)
{//初始化结构体数组
    for (int i = 1; i <= m; i++)
    {
        for (int j = 1; j <= n; j++)
        {
            cell[i][j].dx = i;
            cell[i][j].dy = j;
            cell[i][j].n = 0;
        }
    }
}

void IR(int m, int n)
{//插入行操作,记录下每个元素行数的变化值,在最后一次遍历时做加减法
    int num;
    cin >> num;//记录插入的行数
    while (num--)
    {
        M++;
        int R;
        cin >> R;//在第R行前插入一行
        for (int i = 1; i <= m; i++)
        {
            for (int j = 1; j <= n; j++)
            {
                if (cell[i][j].dx >= R)
                    cell[i][j].n++;
                if (num == 0)
                {
                    cell[i][j].dx += cell[i][j].n;
                    cell[i][j].n = 0;
                }
            }
        }
    }
}

void DR(int m, int n)
{//删除行操作
    int num;
    cin >> num;//记录总共删除的行数
    while (num--)
    {
        M--;
        int R;
        cin >> R;//删除第R行
        for (int i = 1; i <= m; i++)
        {
            for (int j = 1; j <= n; j++)
            {
                if (cell[i][j].dx > R)
                    cell[i][j].n++;
                if (cell[i][j].dx == R)
                {//如果该位置被删除把dx,dy,n置0,
                    cell[i][j].dx = cell[i][j].dy = 0;
                    cell[i][j].n = 0;
                }

                if (num == 0)
                {//最后一次输入删除的行数时,计算出每个位置的最终值,并把n置零
                    cell[i][j].dx -= cell[i][j].n;
                    cell[i][j].n = 0;
                }
            }
        }
    }
}

void IC(int m, int n)
{//插入列操作
    int num;
    cin >> num;
    while (num--)
    {
        N++;
        int C;
        cin >> C;
        for (int i = 1; i <= m; i++)
        {
            for (int j = 1; j <= n; j++)
            {
                if (cell[i][j].dy >= C)
                    cell[i][j].n++;
                if (num == 0)
                {
                    cell[i][j].dy += cell[i][j].n;
                    cell[i][j].n = 0;
                }
            }
        }
    }
}

void DC(int m, int n)
{//删除列操作
    int num;
    cin >> num;
    while (num--)
    {
        N--;
        int C;
        cin >> C;
        for (int i = 1; i <= m; i++)
        {
            for (int j = 1; j <= n; j++)
            {
                if (cell[i][j].dy > C)
                    cell[i][j].n++;
                if (cell[i][j].dy == C)
                {
                    cell[i][j].dx = cell[i][j].dy = 0;
                    cell[i][j].n = 0;
                }
                if (num == 0)
                {
                    cell[i][j].dy -= cell[i][j].n;
                    cell[i][j].n = 0;
                }
            }
        }
    }
}

void EX(int m, int n)
{//交换操作
    int x1, y1, x2, y2;
    cin >> x1 >> y1 >> x2 >> y2;//要交换的两个位置的坐标值
    if (x1 <= M && x2 <= M && y1 <= N && y2 <= N)//确保坐标值合法
    {
        for (int i = 1; i <= m; i++)
        {
            for (int j = 1; j <= n; j++)
            {//遍历找出该位置并改变其位置值
                if (cell[i][j].dy == y1 && cell[i][j].dx == x1)
                {
                    cell[i][j].dy = y2;
                    cell[i][j].dx = x2;
                    continue;
                }
                if (cell[i][j].dy == y2 && cell[i][j].dx == x2)
                {
                    cell[i][j].dy = y1;
                    cell[i][j].dx = x1;
                }
            }
        }
    }
}
int main()
{
    int m, n;//m,n分别记录表格的初始行数和列数
    int num = 1;//记录第几个表格
    while (cin >> m >> n && m != 0 && n != 0)
    {
        M = m;
        N = n;
        init(m, n);
        int s1;//记录操作的种类数
        cin >> s1;
        while (s1--)
        {
            string a;
            char b[4];
            cin >> b;
            a = b;
            if (a == "DR")
                DR(m, n);
            else if (a == "DC")
                DC(m, n);
            else if (a == "IC")
                IC(m, n);
            else if (a == "IR")
                IR(m, n);
            else
                EX(m, n);
        }
        int s2;
        cin >> s2;//记录对该表查询d次数
        cout << "Spreadsheet #" << num << endl;//表示第几个表
        num++;
        while (s2--)
        {//进行查询
            int x, y;
            cin >> x >> y;
            if (cell[x][y].dx == 0 && cell[x][y].dy == 0)
            {
                printf("Cell data in (%d, %d) GONE\n", x, y);
            }
            else
            {
                printf("Cell data in (%d, %d) moved to (%d, %d)\n", x, y, cell[x][y].dx, cell[x][y].dy);
            }
        }
    }
    system("pause");
}


原文地址:https://www.cnblogs.com/denghui666/p/8641682.html

时间: 2024-10-19 14:49:06

UVa512追踪电子表格中的单元格详解的相关文章

追踪电子表格中的单元格

  Spreadsheet Tracking  Data in spreadsheets are stored in cells, which are organized in rows (r) and columns (c). Some operations on spreadsheets can be applied to single cells (r,c), while others can be applied to entire rows or columns. Typical ce

uva 512 追踪电子表格中的单元格

 Spreadsheet Tracking  Data in spreadsheets are stored in cells, which are organized in rows (r) and columns (c). Some operations on spreadsheets can be applied to single cells (r,c), while others can be applied to entire rows or columns. Typical cel

如何把Excel中的单元格等对象保存成图片

对于Excel中的很多对象,比如单元格(Cell),图形(shape),图表(chart)等等,有时需要将它们保存成一张图片.就像截图一样. 最近做一个Excel相关的项目,项目中遇到一个很变态的需求, 需要对Excel中的一些对象进行拍图,比如,对一个单元格设置一些颜色之后拍图,或者对一个图表,报表拍成图片.经过比较曲折的经历,终于还是完成了.拿出来分享一下. 要做Excel,首先当然是查看Excel的com对象模型.地址在这里: http://msdn.microsoft.com/en-us

读取Excel文件中的单元格的内容和颜色

读取Excel文件中的单元格的内容和颜色 先创建一个Excel文件,在A1和A2中随意输入内容,设置A1的字体颜色为红色,A2的背景为黄色.需要 using Excel = Microsoft.Office.Interop.Excel;或者using Microsoft.Excel; string file = @"E:\test.xls"; //测试文件 Excel.Application excel = null; Excel.Workbook wkb = null; try {

gridview中的单元格弹出一个窗口

网格中的单元格弹出一个窗口 $(document).ready(function(){ var s=$('#grdTest_Div'); var tr=$('#grdTest_Div').children().children().children().children(); var grid = document.all.grdTest; tr.each(function(i,j){ if(i!=0&&i!=tr.length) { $('td',j).eq(3).click(funct

C#中怎么在EXCEL中的单元格中画斜线啊 ??

Code Snippet 做法: 1,先添加引用COM,找 Excel 2,using Excel = Microsoft.Office.Interop.Excel; 3, 代码 private Excel.Application m_objExcel = null;        private Excel.Workbooks m_objBooks = null;        private Excel._Workbook m_objBook = null;        private E

如何实时获取DBGrid 中当前单元格输入的内容?

如何获取DBGrid 中当前单元格输入的内容? 还没输入完成,我想实时获取 Cell中的内容,以便作其他处理, 用什么事件呢? 所以Field的Onchange事件是没用的. 这个问题简单啊,每输入1个数据的后就提交(并不是提交到数据库,还是在编辑状态),那么用DataSet就可以取值了 用DBGrid的KeyUp事件: procedure TForm1.DBGrid1KeyUp(Sender: TObject; var Key: Word;   Shift: TShiftState); beg

(很难啊)如何实时获取DBGrid 中当前单元格输入的内容? [问题点数:100分,结帖人yifawu100]

如何获取DBGrid 中当前单元格输入的内容? 还没输入完成,我想实时获取 Cell中的内容,以便作其他处理,用什么事件呢? 所以Field的Onchange事件是没用的. DBGrid1.SelectedField.AsStringDBGrid1.SelectedField.Text看你需要选择 这个问题简单啊,每输入1个数据的后就提交(并不是提交到数据库,还是在编辑状态),那么用DataSet就可以取值了用DBGrid的KeyUp事件: procedure TForm1.DBGrid1Key

iOS中MVC等设计模式详解

iOS中MVC等设计模式详解 在iOS编程,利用设计模式可以大大提高你的开发效率,虽然在编写代码之初你需要花费较大时间把各种业务逻辑封装起来.(事实证明这是值得的!) 模型-视图-控制器(MVC)设计模式是被大家广为熟悉和使用的模式,实际上在移动开发中尤其ios开发中,这种模式被发挥到淋漓尽致 MVC设计模式包括三个部分:模型.视图和控制器. 模型包含数据.信息,逻辑,或对象被认为是部分的业务层的iOS应用. 视图包含所有的用户信息的组件,如文本区域,按钮,滑块,被认为是表示层的一个iOS应用.