UVa512 - Spreadsheet Tracking

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

思路:如果删除的行或者删除的列在查询的行或者列之前,则对应的行或者列减1;如果插入的行或者插入的列小于或者等于查询的行或者列,对应的行或者列加1

代码如下:

#include 
#include 
#include 

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


你可能感兴趣的:(算法竞赛入门第二版,#,uva)