您的位置:首页 > 其它

UVa 512 Spreadsheet Tracking

2016-06-30 10:10 344 查看
针对一个表格的插入、删除行列,和交换两个cell的操作。
 开始的一个对(r,c)表示datasheet的行和列数 
第二行的数字表示要执行的操作的数目
后面跟着多个操作,包括EX,DC,DR,IC,IR
然后是一个整数,表示要查询操作的个数
多个cell的坐标
以(0,0)对完成输入
输出:首先表明这是第几个表;
输出:对于每一个查询,首先输出原来的cell的位置,然后输出当前的位置,如果被删除了,则输出GONE
输出:每两个表之间输出一个空行。

#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;
}
void
arrInit(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 UVa
FILE *fp;
freopen_s(&fp, "data.in.txt", "r", stdin);
freopen_s(&fp, "data.out.txt", "w", stdout);
#endif
sheetArr = new Ele*[ArrSize];
for (int i = 0; i < ArrSize; ++i)
sheetArr[i] = new Ele[ArrSize];
int cnt = 0;//sheet number count

while (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 for

int 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;
else
cout << "Cell data in (" << r << ","
<< c << ") moved to (" <<nowPos.rOld << ","
<< nowPos.cOld << ")" << endl;
}//process query for
cout << endl;
}//read r,c while
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: