【刘汝佳书】例题4-5 UVA512

这篇博客介绍了针对UVA512问题的解题思路,主要涉及二维数组的模拟操作。通过初始序号表示数组元素的位置,并在经过一系列插入删除操作后,重新计算并填充新的位置信息。文中还提到了处理插入空白列到最后一列的特殊情况,并对比了两种不同的处理方法:直接模拟和存储命令后计算新位置。
摘要由CSDN通过智能技术生成

【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 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值