[测试题]钦点

钦点

问题描述
之所以续走的那些香港记者,是因为他们掌握了长者钦点董先生的关键证据,现在这份证
据落到了你的手里。
这份文件是一个 n × m 的矩形,矩形内每一个元素是一个字符串。这份文件经过了 q 次加
密,每次加密是交换两个长宽分别相等的矩形,由于长者有点老花眼,所以他加密的时候两个矩
形间任意一对元素曼哈顿距离大于 1。
由于好奇,你开始解密这份文件,方便起见,加密操作已经倒序给你,你只要按顺序操作一
遍便能解密。
当你破解完这个文件,你会发现你的生命少了做这道题的时间。

输入格式
输入文件名为 appoint.in 
第一行,三个整数 n; m; q。
接下来的 n 行,每行 m 个非空字符串,串与串之间用一个空格隔开。
接下来的 q 行,每行六个整数 x1; y1; x2; y2; l; c 表示两个矩形的左上角和矩形的长宽 (l 对
应 x,c 对应 y)。

输出格式
输出文件名为 appoint.out。
n 行,每行 m 个非空字符串,串与串之间用一个空格隔开。表示解密后的文件。

样例输入

4 4 2
a a b b
a a b b
c c d d
c c d d
1 1 3 3 2 2
3 1 1 3 2 2

样例输出

d d c c
d d c c
b b a a
b b a a

数据规模与约定

设字符串总长为 jSj。
对于前 30% 的数据,保证 jSj ≤ n × m。
对于前 60% 的数据,保证 n; m ≤ 100。
对于 100% 的数据,保证 n; m ≤ 1000; q ≤ 5000; jSj ≤ 107。

题解:

用链表,对于每一个节点,d[i]表示它下方的点的编号,r[i]表示它右方点的编号。

因为每次调换区域时矩形内部的相对关系没有变化,所以不需要对矩形内部的链表进行调整。

每次调换时只要将矩形四个方向的点的链表交换即可。(详见代码)

另外注意每次查找当前位置的点,一定要通过当前链表来查找。(代码中的pos函数)而不能用坐标直接访问。

#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<cmath>
#include<algorithm>
using namespace std;
template<typename T>void read(T &x)
{
    x=0;char c=getchar();
    for(;!isdigit(c);c=getchar());
    for(;isdigit(c);c=getchar())x=x*10+c-‘0‘;
}
int n,m,q,sum[1000005],r[1000005],d[1000005],a[1005][1005];
char ch[10000005];
int pos(int down,int right)
{
    int x=0;
    while(down--)x=d[x];
    while(right--)x=r[x];
    return x;
}
int main()
{
    freopen("appoint.in","r",stdin);
    freopen("appoint.out","w",stdout);
    int i,j,k;
    int x1,x2,y1,y2,xx,yy,p1,p2;
    read(n);read(m);read(q);
    for(i=1;i<=n*m;i++)
    {
        scanf("%s",ch+sum[i-1]+1);
        sum[i]=sum[i-1]+strlen(ch+sum[i-1]+1);
    }
    for(i=1;i<=n;i++)
        for(j=1;j<=m;j++)
            a[i][j]=(i-1)*m+j;
    int tot=n*m;
    for(i=0;i<=n+1;i++)
        for(j=0;j<=m+1;j++)
            if((i||j)&&!a[i][j])a[i][j]=++tot;
    for(i=0;i<=n;i++)
        for(j=0;j<=m;j++)
            r[a[i][j]]=a[i][j+1],
            d[a[i][j]]=a[i+1][j];
    while(q--)
    {
        read(x1);read(y1);read(x2);read(y2);read(xx);read(yy);
        int pos1=pos(x1-1,y1-1),Pos1=d[r[pos1]];
        int pos2=pos(x2-1,y2-1),Pos2=d[r[pos2]];
        for(i=1,p1=d[pos1],p2=d[pos2];i<=xx;i++,p1=d[p1],p2=d[p2])swap(r[p1],r[p2]);
        for(i=1,p1=r[pos1],p2=r[pos2];i<=yy;i++,p1=r[p1],p2=r[p2])swap(d[p1],d[p2]);
        pos1=Pos1;pos2=Pos2;
        for(i=1;i<yy;i++)pos1=r[pos1];
        for(i=1;i<yy;i++)pos2=r[pos2];
        for(i=0,p1=pos1,p2=pos2;i<xx;i++,p1=d[p1],p2=d[p2])swap(r[p1],r[p2]);
        pos1=Pos1;pos2=Pos2;
        for(i=1;i<xx;i++)pos1=d[pos1];
        for(i=1;i<xx;i++)pos2=d[pos2];
        for(i=0,p1=pos1,p2=pos2;i<yy;i++,p1=r[p1],p2=r[p2])swap(d[p1],d[p2]);
    }
    for(i=1,p1=d[0];i<=n;i++,p1=d[p1])
    {
        for(j=1,p2=r[p1];j<=m;j++,p2=r[p2])
        {
            for(k=sum[p2-1]+1;k<=sum[p2];k++)
            printf("%c",ch[k]);
            printf(" ");
        }
        printf("\n");
    }
    return 0;
}
时间: 2024-10-07 01:19:46

[测试题]钦点的相关文章

江钦云:3.15黄金震荡不休,EIA如何平息

黄金技术面分析: 当前黄金从日线级别来看上方承压与MA5日均线压力1201一线,高点触及上方MA60日均线压力附近.布林带口形成张口,且中轨指标向下运行,K线形态呈倒锤形运行.MACD动能指标快线有上拐迹象,绿柱再次形成缩量.附图指标RSI形成W形态后底部筑成,形成上翘.综合日线级别的指标来看,黄金当前仍有上涨趋势,但当前小时内受承压影响暂未形成有效破位.后续主要关注小时线内中轨压力的破位情况.当前凌晨美联储利率决议前瞻来看,前值0.75%的基值当前有再度增加至预期1%迹象,那么当前市场对于美联

IT行业智力测试题

一. 智力测试题: 1. 有A.B.C.D四个人,要在夜里过一座桥.他们通过这座桥分别需要耗时1.2.5.10分钟,只有一支手电,并且同时最多只能两个人一起过桥.请问,如何安排,能够在17分钟内这四个人都过桥? 答案: 第一步:A(1)和B(2)过桥,A(1)返回 Cost:1+2 第二步: C(5)和D(10)过桥,B(2)返回 Cost:10+2 第三步: A(1)和B(2)过桥 Cost:2 2. 有一个埃及人拾到一枚标有"公元前3世纪"的金币,他问一个考古学家,考古学家说是假币

中国大学MOOC-陈越、何钦铭-数据结构-2017春

跟着<中国大学MOOC-陈越.何钦铭-数据结构-2017春>学习,平时练习一下pat上的作业外:在这里记录一下:平时学习视屏的收获. 1.递归内存爆掉        2.解决问题的效率和算法的技巧有关,第一种写法会被鄙视:当执行时间长的,可以看出效率     

1.19测试题

1.19测试题 1.P1007绕钉子的长绳子(https://vijos.org/p/1007) 背景 平面上有N个圆柱形的大钉子,半径都为R,所有钉子组成一个凸多边形. 现在你要用一条绳子把这些钉子围起来,绳子直径忽略不计. 描述 求出绳子的长度 格式 输入格式 第1行两个数:整数N(1<=N<=100)和实数R. 接下来N行按逆时针顺序给出N个钉子中心的坐标 坐标的绝对值不超过100. 输出格式 一个数,绳子的长度,精确到小数点后2位. 样例1 样例输入1 4 1 0.0 0.0 2.0

ADO.net测试题

有幂函数的.cs文件中的代码 using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Data.SqlClient;//引用数据库命名空间 using ADO.NET测试题.数据访问类; using ADO.NET测试题.实体类; using System.Collections; namespa

中国大学MOOC-陈越、何钦铭-数据结构基础习题集 03-1. 二分法求多项式单根

03-1. 二分法求多项式单根(20) 时间限制 400 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 杨起帆(浙江大学城市学院) 二分法求函数根的原理为:如果连续函数f(x)在区间[a, b]的两个端点取值异号,即f(a)f(b)<0,则它在这个区间内至少存在1个根r,即f(r)=0. 二分法的步骤为: 检查区间长度,如果小于给定阈值,则停止,输出区间中点(a+b)/2:否则 如果f(a)f(b)<0,则计算中点的值f((a+b)/2): 如

程序员常识--OJ系统及ACM测试题库大全

OJ是Online Judge系统的简称,用来在线检测程序源代码的正确性.著名的OJ有RQNOJ.URAL等.国内著名的题库有北京大学题库.浙江大学题库等.国外的题库包括乌拉尔大学.瓦拉杜利德大学题库等. 简介: Online Judge系统(简称OJ)是一个在线的判题系统.用户可以在线提交程序多种程序(如C.C++)源代码,系统对源代码进行编译和执行,并通过预先设计的测试数据来检验程序源代码的正确性. 程序: 一个用户提交的程序在Online Judge系统下执行时将受到比较严格的限制,包括运

百度在线笔试编程测试题(Python):整数分解成素数的积

编程测试题: 输入一个正整数将其分解成素数的乘积,输入格式连续输入m个数,然后将这m个数分别分解,如 输入: 2 10 20 输出: 2 5 2 2 5 Python code: def primes(n): primfac = [] d = 2 while d*d <= n: while (n % d) == 0: primfac.append(d) n //= d d += 1 if n > 1: primfac.append(n) return primfac s = int(raw_i

PHP测试题讲解(20161027)

注: 关联数组 关联数组,它的每个 ID 键都关联一个值.在存储有关具体命名的值的数据时,使用数值数组不是最好的做法.通过关联数组,我们可以把值作为键,并向它们赋值. 例子 1 在本例中,我们使用一个数组把年龄分配给不同的人: $ages = array("Peter"=>32, "Quagmire"=>30, "Joe"=>34); 例子 2 本例与例子 1 相同,不过展示了另一种创建数组的方法: $ages['Peter']