【2019.3.29】
读了书上的代码:
1、模拟法
思想:
二维数组d中存放每个格子的原始序号:i*10000+j
如:
10001代表这个格子最开始在1行1列
20003代表这个格子最开始在2行3列
因此,二维数组d的初值如下:
10001 10002 10003 ……
20001 20002 20003 ……
30001 30002 30003 ……
…… …… ……
二维数组d经过一系列插入删除后,会变成类似下面这样的乱序(随便瞎写的):
0 30001 10003 ……
0 0 0
20002 0 40008……
……
此时需要遍历数组d的每一行,每一列,根据格子值来计算原始行列,然后再把当前行列填入二维数组ans,
比如,30001的原始行列是3和1,当前行列是1和2,那么ans[3][1]=10002
输出时需要判断ans[i][j]是否为0,如果为0,则输出GONE,否则输出ans[i][j]
有一组测例是“插入空白列到最后一列的后面”,书上似乎没有考虑到这种情况,在ins函数里改后的代码如下:
#include <iostream>
#include <cstring>
using namespace std;
#define MAXN 10000
int row, col;
char op[2];
int d[100][100];
int d2[100][100];
int ans[100][100];
int label[100];
//将d2中的第q行/列 复制到 d中的第p行/列
void copyline(char type, int p, int q)
{
if(type=='R') {
for(int i=1; i<=col; i++)
d[p][i] = d2[q][i];
}
else {
for(int i=1; i<=row; i++)
d[i][p] = d2[i][q];
}
}
void del(char type)
{
memcpy(d2, d, sizeof(d));
int cntd = 0;
int cntd2 = (type=='R')? row : col;
for(int i=1; i<=cntd2; i++) {
if(!label[i]) copyline(type, ++cntd, i);
}
if(type=='R') row = cntd;
else col = cntd;
}
void ins(char type)
{
memcpy(d2, d, sizeof(d));
int cntd = 0;
int cntd2