# 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; } ```