uva 512

Posted zlwjy

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了uva 512相关的知识,希望对你有一定的参考价值。

模拟,先处理表格后面的行和列再处理前面的(无论是插入还是删除),否则操作会出问题。

#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
#define _for(i, a, b) for (int i = (a); i <= (b);i++)
struct sheet{
    int x, y;
} c[55][55];//记录下原始下标
int n, m,row,col;
void init(){
    for (int i = 1; i <= 54;i++){
        for (int j = 1; j <= 54;j++){
            c[i][j].x = i;
            c[i][j].y = j;
        }
    }
}//赋初值
void ir(){
    int a[10];
    int num;
    cin >> num;
    _for(i,0,num-1){
        cin >> a[i];
    }
    sort(a, a + num);
    for (int i = num - 1; i >= 0;i--){
        for (int j = row; j >= a[i];j--){
            for (int k = 1; k <= col;k++){
                c[j + 1][k].x = c[j][k].x;
                c[j + 1][k].y = c[j][k].y;
            }
        }//往下移一格,后面的先移
        for (int k = 1; k <= col;k++){
            c[a[i]][k].x = c[a[i]][k].y=0;
        }//添加的空白行置为0
        row++;//行数加一
    }

};
void ic(){
    int a[10];
    int num;
    cin >> num;
    _for(i, 0, num-1)
    {
        cin >> a[i];
    }
    sort(a, a + num);
    for (int i = num - 1; i >= 0;i--){
        for (int j = col; j >= a[i];j--){
            for (int k = 1; k <= row;k++){
                c[k][j + 1].x = c[k][j].x;
                c[k][j + 1].y = c[k][j].y;
            }
        }
        for (int k = 1; k <= row;k++){
            c[k][a[i]].x = 0;
            c[k][a[i]].y = 0;
        }
        col++;
    }
};
void dr(){
    int a[10];
    int num;
    cin >> num;
    _for(i, 0, num-1)
    {
        cin >> a[i];
    }
    sort(a, a + num);
    for (int i = num - 1; i >= 0;i--){
        for (int j = a[i] + 1; j <= row;j++){
            for (int k = 1; k <= col;k++){
                c[j-1][k].x = c[j][k].x;
                c[j-1][k].y = c[j][k].y;
            }
        }
        row--;
    }
};
void dc(){
    int a[10];
    int num;
    cin >> num;
    _for(i, 0, num-1)
    {
        cin >> a[i];
    }
    sort(a, a + num);
    for (int i = num - 1; i >= 0;i--){
        for (int j = a[i] + 1; j <= col;j++){
            for (int k = 1; k <= row;k++){
                c[k][j - 1].x = c[k][j].x;
                c[k][j - 1].y = c[k][j].y;
            }
        }
        col--;
    }
};
int main(){
    int kase = 0;
    while(scanf("%d%d",&n,&m)==2&&(n||m)){
        row = n, col = m;
        init();
        int t;
        scanf("%d", &t);
        while(t--){
            string op;
            cin >> op;
            if(op=="IR"){
                ir();
            }else if(op=="IC"){
                ic();
            }else if(op=="DR"){
                dr();
            }else if(op=="DC"){
                dc();
            }else{
                int x1, x2, y1, y2,t1,t2;
                cin >> x1 >> y1 >> x2 >> y2;
                t1 = c[x1][y1].x, t2 = c[x1][y1].y;
                c[x1][y1].x = c[x2][y2].x, c[x1][y1].y = c[x2][y2].y;
                c[x2][y2].x = t1, c[x2][y2].y=t2;
            }
        }
        if(kase>0)
            puts("");
        printf("Spreadsheet #%d ", ++kase);
        int q;
        cin >> q;

        while (q--)
        {
            int x1, y1,flag=0;
            cin >> x1 >> y1;
            for(int i=1;i<=row&&!flag;i++){
                for(int j=1;j<=col&&!flag;j++){
                    if(c[i][j].x==x1&&c[i][j].y==y1){
                        flag = 1;
                        printf("Cell data in (%d,%d) moved to (%d,%d) ", c[i][j].x, c[i][j].y,i,j);
                    }
                }
            }
            if(!flag) printf("Cell data in (%d,%d) GONE ",x1,y1);
        }
    }
    return 0;
}

 

以上是关于uva 512的主要内容,如果未能解决你的问题,请参考以下文章

UVA512B

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

算法竞赛入门经典 第四章

Uva 12206 Stammering Aliens

2019年2月做题记录

uva是啥意思