题意:给出一个表格的行数和列数,及一系列的插入行,删除行,插入列,删除列,单元格交换操作,然后给出系列的查询,问初始的单元格新的位置
思路:如果删除的行或者删除的列在查询的行或者列之前,则对应的行或者列减1;如果插入的行或者插入的列小于或者等于查询的行或者列,对应的行或者列加1
代码如下:
#include <iostream>
#include <fstream>
#include <string>
using namespace std;
const int MAX_ROW = 100;
const int COMMAND_NUM = 10;
struct Cmd
{
string cmd_name;
int opers_num;
int opers[COMMAND_NUM];
int r1, c1, r2, c2;
};
Cmd cmd[MAX_ROW];
int r, c, n;
void processInput(string &str, int i);
bool solve(int& x, int& y);
int main()
{
#ifndef ONLINE_JUDGE
ifstream fin("F:\\OJ\\uva_in.txt");
streambuf *back = cin.rdbuf(fin.rdbuf());
#endif
int cas = 0;
while (cin >> r >> c)
{
if (0 == r && 0 == c) break;
cin >> n;
for (int i = 0; i < n; i++)
{
string str;
cin >> str;
processInput(str, i);
}
if (cas != 0) cout << endl;
cout << "Spreadsheet #" << ++cas << endl;
int number;
cin >> number;
while (number-- > 0)
{
int srcx, srcy, dstx, dsty;
cin >> srcx >> srcy;
dstx = srcx, dsty = srcy;
if (solve(dstx, dsty))
{
cout << "Cell data in (" << srcx << "," << srcy << ") moved to (" << dstx << "," << dsty << ")" << endl;
}
else
{
cout << "Cell data in (" << srcx << "," << srcy << ") GONE" << endl;
}
}
}
#ifndef ONLINE_JUDGE
cin.rdbuf(back);
#endif
return 0;
}
void processInput(string &str, int i)
{
if (str != "EX")
{
cmd[i].cmd_name = str;
cin >> cmd[i].opers_num;
for (int j = 0; j < cmd[i].opers_num; j++)
{
cin >> cmd[i].opers[j];
}
}
else
{
cmd[i].cmd_name = str;
cin >> cmd[i].r1 >> cmd[i].c1 >> cmd[i].r2 >> cmd[i].c2;
}
}
bool solve(int& x, int& y)
{
for (int i = 0; i < n; i++)
{
if (cmd[i].cmd_name == "DR")
{
int srcx = x, srcy = y;
for (int j = 0; j < cmd[i].opers_num; j++)
{
if (cmd[i].opers[j] < srcx) x--;
else if (cmd[i].opers[j] == srcx) return false;
}
}
else if (cmd[i].cmd_name == "IR")
{
int srcx = x, srcy = y;
for (int j = 0; j < cmd[i].opers_num; j++)
{
if (cmd[i].opers[j] <= srcx) x++;
}
}
else if (cmd[i].cmd_name == "DC")
{
int srcx = x, srcy = y;
for (int j = 0; j < cmd[i].opers_num; j++)
{
if (cmd[i].opers[j] < srcy) y--;
else if (cmd[i].opers[j] == srcy) return false;
}
}
else if (cmd[i].cmd_name == "IC")
{
int srcx = x, srcy = y;
for (int j = 0; j < cmd[i].opers_num; j++)
{
if (cmd[i].opers[j] <= srcy) y++;
}
}
else if (cmd[i].cmd_name == "EX")
{
if (cmd[i].r1 == x && cmd[i].c1 == y) { x = cmd[i].r2, y = cmd[i].c2; }
else if (cmd[i].r2 == x && cmd[i].c2 == y) { x = cmd[i].r1, y = cmd[i].c1; }
}
}
return true;
}