UVA-512-Spreadsheet Tracking 简单模拟题 对一个表进行增删操作后查表 打表写法+详细注释

来源:互联网 发布:让 皮埃尔.热内 知乎 编辑:程序博客网 时间:2024/05/29 10:53

题目我就不贴了(懒)。

题意:

有一个r行c列的电子表格,对其进行n个操作。操作类型分为5种:

1. 删除行 2. 删除列 3. 插入行 4. 插入列 5. 交换两个元素位置

输入查找点(没操作前的位置),输出经过n个操作后对应的位置

思路:

1. 我是先打了个表

2. 然后我再对表执行n个操作

3. 最后我再进行搜表输

4. 另一种思路(网上的大部分思路)是把n个操作都存起来,然后对查询点进行变动然后输出,这个思路的代码量比我的短很多,我的思路写了4000,150行。存操作的思路一般是1000+ ,不知道多少行。新手和老手的差距就在思路上体现出来了。

注意:

1. 不同的测试样例之间用空行隔开(即第一个样例不输出空行,其他样例都先输出一个空行)。

2. 测试样例要先在第一行输出是第几组,即Spreadsheet #num。

3. 题目要求多组数据输入,遇到r=c=0时结束程序

4. wa了很多次在格式上,烦!

5. 剩余的我在注释里都写得很详细了,不明白可以问,谢谢。


我的AC代码如下:


#include <iostream>#include <algorithm>#include <cstdio>using namespace std;int a[55][55],b[10000];//打表,因为我的思想是最后搜表输出void init(){    for(int i=1;i<=50;i++)        for(int j=1;j<=50;j++)            a[i][j]=(i-1)*50+j;}int main(){    //freopen("input.txt","r",stdin);    int r,c,n,m,kase=0,temp=0;    char ch1,ch2;    while(cin >> r >> c)    {        if(r==0 && c==0)            break;        //用temp控制测试样例间的空行,即第二个开始输出空行        if(temp)            cout << endl;        temp++;        //用kase控制第几个样例        kase++;        cout << "Spreadsheet #" << kase << endl;        //打表        init();        //输入n个操作,并执行        cin >> n;        for(int i=0;i<n;i++)        {            //读入处理类型            cin >> ch1 >> ch2;            //删除行            if(ch1=='D' && ch2=='R')            {                cin >> m;                for(int j=0;j<m;j++)                    cin >> b[j];                sort(b,b+m);                //删除行的实际操作                for(int j=0;j<m;j++)                {                    for(int u=b[j];u<r;u++)                        for(int v=1;v<=c;v++)                            a[u][v]=a[u+1][v];                    //更新剩余操作修改行下标                    for(int v=j+1;v<m;v++)                        b[v]--;                    r--;                }            }            //删除列            else if(ch1=='D' && ch2=='C')            {                cin >> m;                for(int j=0;j<m;j++)                    cin >> b[j];                sort(b,b+m);                //删除列的实际操作                for(int j=0;j<m;j++)                {                    for(int u=b[j];u<c;u++)                        for(int v=1;v<=r;v++)                            a[v][u]=a[v][u+1];                    //更新剩余操作修改列下标                    for(int v=j+1;v<m;v++)                        b[v]--;                    c--;                }            }            //增加列            else if(ch1=='I' && ch2=='C')            {                cin >> m;                for(int j=0;j<m;j++)                    cin >> b[j];                sort(b,b+m);                //增加列的实际操作                for(int j=0;j<m;j++)                {                    c++;                    for(int u=c;u>b[j];u--)                        for(int v=1;v<=r;v++)                            a[v][u]=a[v][u-1];                    for(int v=1;v<=r;v++)                        a[v][b[j]]=0;                    //更新剩余操作修改列下标                    for(int v=j+1;v<m;v++)                        b[v]++;                }            }            //增加行            else if(ch1=='I' && ch2=='R')            {                cin >> m;                for(int j=0;j<m;j++)                    cin >> b[j];                sort(b,b+m);                //增加行的实际操作                for(int j=0;j<m;j++)                {                    r++;                    for(int u=r;u>b[j];u--)                        for(int v=1;v<=c;v++)                            a[u][v]=a[u-1][v];                    for(int v=1;v<=c;v++)                        a[b[j]][v]=0;                    //更新剩余操作修改行下标                    for(int v=j+1;v<m;v++)                        b[v]++;                }            }            //交换表中的两个变量(五个处理中最简单的一个)            else if(ch1=='E' && ch2=='X')            {                int x1,y1,x2,y2,t;                cin >> x1 >> y1 >> x2 >> y2;                t=a[x1][y1];                a[x1][y1]=a[x2][y2];                a[x2][y2]=t;            }        }        int sum,tx,ty,flag;        //输入查询数,并搜表输出,搜不到就输出GONE        cin >> sum;        for(int u=0;u<sum;u++)        {            //输入查询点            cin >> tx >> ty;            //记得每次搜都要把flag这个判断变量清零            flag=0;            for(int i=1;i<=r;i++)            {                for(int j=1;j<=c;j++)                {                    if(a[i][j]==(tx-1)*50+ty)                    {                        cout << "Cell data in (" << tx <<','<<ty<<") moved to (" << i << ',' << j << ")" << endl;                        //用flag判断搜索终点                        flag=1;                        break;                    }                }                //用flag判断搜索终点                if(flag==1)                    break;            }            //如果搜不到就输出GONE            if(flag==0)                cout << "Cell data in (" << tx <<','<<ty<<") GONE" << endl;        }    }    return 0;}

0 0
原创粉丝点击