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\n", ++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)\n", c[i][j].x, c[i][j].y,i,j);
                    }
                }
            }
             if(!flag) printf( "Cell data in (%d,%d) GONE\n",x1,y1);
        }
    }
     return  0;
}

 

猜你喜欢

转载自www.cnblogs.com/zlwjy/p/12093803.html