UVa512 - Spreadsheet Tracking

来源:互联网 发布:win7网络连接图标不见 编辑:程序博客网 时间:2024/05/18 02:26

题意:给出一个表格的行数和列数,及一系列的插入行,删除行,插入列,删除列,单元格交换操作,然后给出系列的查询,问初始的单元格新的位置

思路:如果删除的行或者删除的列在查询的行或者列之前,则对应的行或者列减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_JUDGEifstream fin("F:\\OJ\\uva_in.txt");streambuf *back = cin.rdbuf(fin.rdbuf());#endifint 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_JUDGEcin.rdbuf(back);#endifreturn 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;}


0 0
原创粉丝点击