UVa 512 Spreadsheet Tracking

来源:互联网 发布:网络培训班 编辑:程序博客网 时间:2024/06/05 18:16
  1. 针对一个表格的插入、删除行列,和交换两个cell的操作。
  2.  开始的一个对(r,c)表示datasheet的行和列数 
  3. 第二行的数字表示要执行的操作的数目
  4. 后面跟着多个操作,包括EX,DC,DR,IC,IR
  5. 然后是一个整数,表示要查询操作的个数
  6. 多个cell的坐标
  7. 以(0,0)对完成输入
  8. 输出:首先表明这是第几个表;
  9. 输出:对于每一个查询,首先输出原来的cell的位置,然后输出当前的位置,如果被删除了,则输出GONE
  10. 输出:每两个表之间输出一个空行。

#include<iostream>#include<string>using namespace std;/*struct Ele {int rOld;int cOld;};const int ArrSize = 100000;Ele** sheetArr;int rowNum, colNum;void DR(unsigned int r) {for (int i = r; i < rowNum; ++i)for (int j = 1; j <= colNum; ++j) sheetArr[i][j] = sheetArr[i + 1][j];rowNum--;}void DC(unsigned int c) {for (int j = c; j < colNum; ++j)for (int i = 1; i <= rowNum; ++i)sheetArr[i][j] = sheetArr[i][j + 1];colNum--;}void IC(unsigned int c) {for (int j = colNum; j >= c; --j)for (int i = 1; i <= rowNum; ++i)sheetArr[i][j + 1] = sheetArr[i][j];for (int i = 1; i <= rowNum; ++i)sheetArr[i][c] = { 0,0 };colNum++;}void IR(unsigned int r) {for (int i = rowNum; i >= r; --i)for (int j = 1; j <= colNum; ++j)sheetArr[i + 1][j] = sheetArr[i][j];for (int j = 1; j <= colNum; ++j)sheetArr[r][j] = { 0,0 };rowNum++;}void EX(unsigned int rPre, unsigned int cPre, unsigned int rNew, unsigned int cNew) {Ele temp;temp = sheetArr[rPre][cPre];sheetArr[rPre][cPre] = sheetArr[rNew][cNew];sheetArr[rNew][cNew] = temp;}void print(){for (int i = 1; i <= rowNum; ++i) {for (int j = 1; j <= colNum; ++j)cout << sheetArr[i][j].cOld << "," << sheetArr[i][j].rOld << " ";cout << endl;}}Ele find(int r, int c){Ele temp = { 0,0 };for (int i = 1; i <= rowNum; ++i)for (int j = 1; j <= colNum; ++j)if (sheetArr[i][j].rOld == r && sheetArr[i][j].cOld == c) {temp = { i, j };return temp;}return temp;}voidarrInit(int r,int c){   for (int i = 1; i <= r; ++i)for (int j = 1; j <= c; ++j)sheetArr[i][j] = { i,j };}int main(){#ifndef UVaFILE *fp;freopen_s(&fp, "data.in.txt", "r", stdin);freopen_s(&fp, "data.out.txt", "w", stdout);#endifsheetArr = new Ele*[ArrSize];for (int i = 0; i < ArrSize; ++i)sheetArr[i] = new Ele[ArrSize];int cnt = 0;//sheet number countwhile (cin >> rowNum >> colNum) {if (rowNum == 0 || colNum == 0)break;arrInit(rowNum, colNum);cnt++;int operCnt;cin >> operCnt;for (int i = 0; i < operCnt; ++i) {string cmd;int rcNum;cin >> cmd;if (cmd == "DR") {cin >> rcNum;for (int i = 0; i < rcNum; ++i) {int rLoc;cin >> rLoc;DR(rLoc-i);}}if (cmd == "DC") {cin >> rcNum;for (int i = 0; i < rcNum; ++i) {int rLoc;cin >> rLoc;DC(rLoc-i);}}if (cmd == "IC") {cin >> rcNum;for (int i = 0; i < rcNum; ++i) {int rLoc;cin >> rLoc;IC(rLoc+i);}}if (cmd == "IR") {cin >> rcNum;for (int i = 0; i < rcNum; ++i) {int rLoc;cin >> rLoc;IR(rLoc+i);}}if (cmd == "EX") {int rPre, cPre, rNew, cNew;cin >> rPre >> cPre >> rNew >> cNew;EX(rPre, cPre, rNew, cNew);}}//read operation forint qryNum;cin >> qryNum;    cout << "Spreadsheet #" << cnt << endl;for (; qryNum > 0; --qryNum){int r, c;cin >> r >> c;Ele nowPos = find(r, c);if (nowPos.cOld == 0 || nowPos.rOld == 0)cout << "Cell data in (" << r << ","<< c << ") GONE" << endl;elsecout << "Cell data in (" << r << ","<< c << ") moved to (" <<nowPos.rOld << ","<< nowPos.cOld << ")" << endl;}//process query forcout << endl;}//read r,c while    return 0;}


0 0