【思维·模拟】jzoj1433数码问题 纪中集训提高B组

本文通过解析jzoj1433数码问题,介绍了如何通过旋转行和旋转列操作,将数字移动到目标位置。针对给定的N*N矩阵,Alice需要将K个数字按顺序移动到指定位置,并计算每个数字所需的操作次数。文章讨论了问题的解决方案,包括离线处理询问和优化操作次数的方法,并提出了对于操作顺序不限制情况下的问题思考。
摘要由CSDN通过智能技术生成

Description

Alice有一个N*N的格子,把1-N^2按照从上到下从左到右的顺序填进表格中,允许在表格上进行两种操作:
  (1) 旋转行——这一行的数向右移动一个位置,而最后一列的数会移到第一列;
  (2) 旋转列——这一列的数向下移动一个位置,最后一行的数会移到第一行。
  Alice想把数X移到(R,C)处可以采用以下方法:
  •如果X不在C这一列,通过旋转行操作把X移到C这一列;
  •如果X不在R这一行,通过旋转列操作把X移到R这一行。
  下面是一个把6移到(3,4)的例子:
  
  Alice现在想采用上述方法,依次把K个数移到各自的目标位置,编程计算每个数需要几次操作。

Input

第一行包含两个整数N(12<=N<=10000)和K(1<=K<=1000)。
  接下来K行,每行包含三个整数X(1<=X<=N^2)、R和C(1<=R,C<=N),描述需要移动的数以及目标位置。
  Alice必须按照输入顺序依次移动。

Output

输出K行,每行输出一个整数,表示操作次数。

Sample Input

输入1:
4 1
6 3 4

输入2:
4 2
6 3 4
6 2 2

输入3:
5 3
1 2 2
2 2 2
12 5 5

Sample Output

输出1:
3

输出2:
3
5

输出3:
2
5
3


考场上唯一A了的题,但还是想写一写,挺有意思的。
刚开始看错了题面以为询问之间相互独立 (那这不是大水题吗)
认真读了题目发现不是2333。
整个数组完全模拟肯定是不可能的,而且 n n n那么大。
发现 k k k比较小,于是将询问离线,只存需要被询问的点的位置更新状况,每一次操作都看一下后面的点再经过操作之后跑到哪里去了,更新它的位置,复杂度 k 2 k^2 k2,但其实还跑不满。

后面又在想如果没有规定先移行还是先移列的问题,那么移行移列的顺序是会影响答案的,那如果把这道题改成不限制先移什么,然后求最小的移动次数呢?
唔,好像有点难。(反正本蒟蒻没有思考出来)

#pragma GCC optimize(2)
//shu_ma_wen_ti 
/*
每进行一次旋转行操作->列++
每进行一次旋转列操作->行++
先移列再移行
最少? 
*/
#include<cstdio>
#include<algorithm>
#
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值