紫書——Spreadsheet Tracking UVA - 512
阿新 • • 發佈:2018-11-09
題解:
題目大意為 你輸入幾個操作,改變該表格。然後輸入原來的幾個點,輸出改變之後的位置或者gone(已被刪除)
直接操作表格比較難寫,所以思想就是先把操作和原來的點想記錄下來;
然後判斷每個點經過每個操作後的位置。書上都寫了這兩種方法。我的做法是第二個
#include <bits/stdc++.h> using namespace std; struct Node{ //儲存一開始的點數 int r; int c; }node[100]; string opera[500]; void exope(int tim,int n){ //開始對第n個點進行t次操作 int isdel = 0; //判斷是否被del了 for(int i = 0; i < tim; i++){ stringstream ss(opera[i]); string tmp; ss >> tmp; if(!tmp.compare("DC") || !tmp.compare("DR")){ int tno; if(tmp[1] == 'C') tno = node[n].c; else tno = node[n].r; int dell,isjud = tno; //jud是儲存沒改變之前r或者c的資料,dell則是要刪除的r、c ss >> dell; //去掉第一個 while(ss >> dell){ if(dell == isjud){ isdel = 1; break; } else if(dell < isjud) tno--; } if(tmp[1] == 'C') node[n].c = tno; else node[n].r = tno; }else if(!tmp.compare("IC") || !tmp.compare("IR")){ int tno; if(tmp[1] == 'C') tno = node[n].c; else tno = node[n].r; int dell,isjud = tno; ss >> dell; //去掉第一個 while(ss >> dell){ if(dell <= isjud) tno++; } if(tmp[1] == 'C') node[n].c = tno; else node[n].r = tno; }else{ int r1,c1,r2,c2; ss >> r1 >> c1 >> r2 >> c2; if(node[n].r == r1 && node[n].c == c1){ node[n].r = r2; node[n].c = c2; } else if(node[n].r == r2 && node[n].c == c2){ node[n].r = r1; node[n].c = c1; } } } if(isdel) printf("GONE\n"); else printf("moved to (%d,%d)\n",node[n].r,node[n].c); } int main() { //freopen("in.txt","r",stdin); // freopen("out.txt","w",stdout); int rnd = 1; int curr,curc; //一開始的行和列 while(scanf("%d%d",&curr,&curc) == 2 && curr){ int ope; scanf("%d",&ope); getchar(); for(int i = 0; i < ope; i++){ getline(cin,opera[i]); } int dnum; scanf("%d",&dnum); for(int i = 0; i < dnum; i++){ scanf("%d%d",&node[i].r,&node[i].c); } //到這裡為止前面是為了記錄所有操作和點數 if(rnd != 1) printf("\n"); printf("Spreadsheet #%d\n",rnd++); for(int i = 0; i < dnum; i++){ printf("Cell data in (%d,%d) ",node[i].r,node[i].c); exope(ope,i); } } return 0; }