【题意】
有一个r行c列的电子表格,行从上到下编号为1~r,列从左到右编号为1~c。对其进行n个操作。操作类型分为5种:
1. 删除行 2. 删除列 3. 插入行 4. 插入列 5. 交换两个元素位置
输入初始查找位置,输出经过n个操作后,变更的位置。
【分析】
1. 可以直接模拟,但是需要开很多额外空间;
2. 先将n个操作存起来,然后对每个查询分别执行这个n个操作,输出变更后位置。这样节约空间,也很简单方便
【注意】
注意:1. 在执行DR,DC,IR,IC操作时,必须先将位置(x,y)保存下,见代码,即:xx = x, yy = y;(因为这四个操作是基于初始的位置x,y进行的)
2. 不同的测试用例用空行隔开,最后一个用例不能有空行,开始Wrong answer就因为最后多输出一空行
代码如下:
#include
#include
#include
#include
using namespace std;
const int MAX = 10000;
int r,c,n;
struct cmd{//构造结构体类型的变量,其元素包括操作字符串,每个操作要删除或插入的行或列数,两个位置的坐标,方便后面处理
string s;
int A,a[20];
int r1,c1,r2,c2;
}cmds[MAX];
void save(string str, int i)//分别保存每一个处理步骤的具体内容
{
int A;
if(str!="EX"){
cin>>A;//本次操作所要删除或插入的行或列数
cmds[i].s = str; cmds[i].A = A;
for(int j=0;j
>cmds[i].a[j]; } else if(str=="EX"){//如果所要输入的操作为交换位置,则需要一次输入两个位置的坐标 cmds[i].s = str; cin>>cmds[i].r1>>cmds[i].c1>>cmds[i].r2>>cmds[i].c2; } } bool solve(int& x, int& y) { int xx,yy; for(int i=0;i
>r>>c) //输入表格的行数和列数 { if(r==0&&c==0) break; //输入行列数为0时结束 cin>>n; //输入操作数 if(icase>0) cout<
>str; //输入操作步骤 save(str,i); } cout<<"Spreadsheet #"<<++icase<
>q; //输入有几组测试实例 while(q--) { int x,y,xx,yy; cin>>x>>y; xx = x; yy = y; //输入初始位置,并将初始位置保存 if(solve(x,y)) printf("Cell data in (%d,%d) moved to (%d,%d)\n",xx,yy,x,y); //xx,yy在这里起到保存初始位置的作用 else printf("Cell data in (%d,%d) GONE\n",xx,yy); } } return 0; }