# UVa 512 - Spreadsheet Tracking
---
# 題目大意
給一表格及一些操作,包括插入行、列,刪除行、列,交換兩格,接著問你某些格子經過這些操作後跑去哪了,如果被刪掉了就輸出GONE。
---
# 題解
存下每筆操作,接著對於每筆詢問模擬一遍所有操作並輸出,要注意同一操作是同時發生的。主要就是好好模擬就可以了,只是很麻煩==
```=C++
#include <bits/stdc++.h>
#define ll long long
#define pb push_back
#define ft first
#define sec second
#define pr pair<int,int>
#define ISCC ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
using namespace std;
int t ,n ,m ,g[55][55] ,k ,cas ,cnt;
int x ,y;
struct oper{
string s;
pr a ,b;
vector<int> vec;
}mov[505];
void sol()
{
for(int i=0 ;i<t ;i++)
{
int tp=0;
if(mov[i].s == "DR")
{
for(auto w:mov[i].vec)
{
if(w==x){x = y = -1; return;}
if(w<x) tp++;
}
x-=tp;
}
else if(mov[i].s == "DC")
{
for(auto w:mov[i].vec)
{
if(w==y){x = y = -1; return;}
if(w<y) tp++;
}
y-=tp;
}
else if(mov[i].s == "IR")
{
for(auto w:mov[i].vec) if(w<=x) tp++;
x+=tp;
}
else if(mov[i].s == "IC")
{
for(auto w:mov[i].vec) if(w<=y) tp++;
y+=tp;
}
else if(mov[i].s == "EX")
{
if(mov[i].a.ft == x && mov[i].a.sec == y)
x = mov[i].b.ft ,y = mov[i].b.sec;
else if(mov[i].b.ft == x && mov[i].b.sec == y)
x = mov[i].a.ft ,y = mov[i].a.sec;
}
}
}
int main()
{
while(cin >> n >> m)
{
if(!n && !m) break;
if(cnt) cout << '\n';
printf("Spreadsheet #%d\n" ,++cnt);
cin >> t;
for(int i=0 ;i<t ;i++)
{
mov[i].vec.clear();
mov[i].a.ft = mov[i].a.sec = mov[i].b.ft = mov[i].b.sec= 0;
cin >> mov[i].s;
if(mov[i].s[0] == 'D' || mov[i].s[0] == 'I')
{
cin >> k;
for(int j=0 ,p ;j<k ;j++) cin >> p ,mov[i].vec.pb(p);
}
else cin >> mov[i].a.ft >> mov[i].a.sec >> mov[i].b.ft >> mov[i].b.sec;
}
cin >> cas;
for(int i=0 ;i<cas ;i++)
{
cin >> x >> y;
printf("Cell data in (%d,%d) ",x ,y);
sol();
if(x==-1) cout << "GONE\n";
else printf("moved to (%d,%d)\n",x ,y);
}
}
return 0;
}
```