你一定玩过八数码游戏,它实际上是在一个3×3的网格中进行的,1个空格和1~8这8个数字恰好不重不漏地分布在这3×3的网格中。

例如:

5 2 8
1 3 _
4 6 7

在游戏过程中,可以把空格与其上、下、左、右四个方向之一的数字交换(如果存在)。

例如在上例中,空格可与左、上、下面的数字交换,分别变成:

5 2 8       5 2 _      5 2 8
1 _ 3 1 3 8 1 3 7
4 6 7 4 6 7 4 6 _

奇数码游戏是它的一个扩展,在一个nn×nn的网格中进行,其中nn为奇数,1个空格和1~n2−1n2−1这n2−1n2−1个数恰好不重不漏地分布在nn×nn的网格中。

空格移动的规则与八数码游戏相同,实际上,八数码就是一个n=3n=3的奇数码游戏。

现在给定两个奇数码游戏的局面,请判断是否存在一种移动空格的方式,使得其中一个局面可以变化到另一个局面。

输入格式

多组数据,对于每组数据:

第1行输入一个整数nn,nn为奇数。

接下来nn行每行nn个整数,表示第一个局面。

再接下来nn行每行nn个整数,表示第二个局面。

局面中每个整数都是00~n2−1n2−1之一,其中用00代表空格,其余数值与奇数码游戏中的意义相同,保证这些整数的分布不重不漏。

输出格式

对于每组数据,若两个局面可达,输出TAK,否则输出NIE。

数据范围

1≤n<5001≤n<500

输入样例:

3
1 2 3
0 4 6
7 5 8
1 2 3
4 5 6
7 8 0
1
0
0

输出样例:

TAK
TAK
 

算法:归并排序 + 逆序数

题解:将两个二维数组转换为一维数组(其中不包含0,0为空格),计算出两个一维数组的逆序数,然后算出它们的奇偶性是否相同,相同则可以变化成另一个局面,否则不能。

#include <iostream>
#include <cstdio>
#include <cmath> using namespace std; const int maxn = 3e5+; typedef long long ll; int arr[maxn];
int b[maxn];
ll cnt; void merge_sort(int l, int mid, int r) {
int i = l, j = mid + ;
int k = ;
while(i <= mid || j <= r) {
if(j > r || (i <= mid && arr[i] <= arr[j])) {
b[k++] = arr[i++];
} else {
cnt += mid - i + ;
b[k++] = arr[j++];
}
}
for(int i = ; i < k; i++) {
arr[l + i] = b[i];
}
} void merge(int l, int r) {
if(l < r) {
int mid = (l + r) >> ;
merge(l, mid);
merge(mid + , r);
merge_sort(l, mid, r);
}
} void fun(ll &sum, int n) {
int k = ;
for(int i = ; i <= n * n; i++) {
int x;
scanf("%d", &x);
if(x != ) {
arr[++k] = x;
}
}
cnt = ;
merge(, k);
sum = cnt;
} int main() {
int n;
while(~scanf("%d", &n)) {
ll sum1, sum2;
fun(sum1, n);
fun(sum2, n);
if((long long)abs(sum1 - sum2) % ) {
printf("NIE\n");
} else {
printf("TAK\n");
}
}
return ;
}

AcWing:108. 奇数码问题(归并排序 + 逆序数)的更多相关文章

  1. Ultra-QuickSort---poj2299 (归并排序.逆序数.树状数组.离散化)

    题目链接:http://poj.org/problem?id=2299 题意就是求把数组按从小到大的顺序排列,每次只能交换相邻的两个数, 求至少交换了几次 就是求逆序数 #include<std ...

  2. AcWing 107. 超快速排序(归并排序 + 逆序对 or 树状数组)

    在这个问题中,您必须分析特定的排序算法----超快速排序. 该算法通过交换两个相邻的序列元素来处理n个不同整数的序列,直到序列按升序排序. 对于输入序列9 1 0 5 4,超快速排序生成输出0 1 4 ...

  3. CH Round #72 奇数码问题[逆序对 观察]

    描述 你一定玩过八数码游戏,它实际上是在一个3*3的网格中进行的,1个空格和1~8这8个数字恰好不重不漏地分布在这3*3的网格中. 例如:5 2 81 3 _4 6 7 在游戏过程中,可以把空格与其上 ...

  4. HDU 1394 Minimum Inversion Number(最小逆序数/暴力 线段树 树状数组 归并排序)

    题目链接: 传送门 Minimum Inversion Number Time Limit: 1000MS     Memory Limit: 32768 K Description The inve ...

  5. POJ 2299 Ultra-QuickSort 逆序数 树状数组 归并排序 线段树

    题目链接:http://poj.org/problem?id=2299 求逆序数的经典题,求逆序数可用树状数组,归并排序,线段树求解,本文给出树状数组,归并排序,线段树的解法. 归并排序: #incl ...

  6. poj 1804 (nyoj 117)Brainman : 归并排序求逆序数

    点击打开链接 Brainman Time Limit: 1000MS   Memory Limit: 30000K Total Submissions: 7810   Accepted: 4261 D ...

  7. poj 2299 Ultra-QuickSort :归并排序求逆序数

    点击打开链接 Ultra-QuickSort Time Limit: 7000MS   Memory Limit: 65536K Total Submissions: 34676   Accepted ...

  8. hdu 1394 Minimum Inversion Number (裸树状数组 求逆序数 && 归并排序求逆序数)

    题目链接 题意: 给一个n个数的序列a1, a2, ..., an ,这些数的范围是0-n-1, 可以把前面m个数移动到后面去,形成新序列:a1, a2, ..., an-1, an (where m ...

  9. hdu 4911 Inversion (分治 归并排序 求逆序数)

    题目链接 题意:给n个数,求交换k次相邻的数之后的最小的逆序数对. 用分治的方法,以前在poj上做过这种题,昨天比赛的时候忘了.... 下面的归并排序还是以前的模板. #include <ios ...

随机推荐

  1. Linux运维必备工具

    1. 查看进程占用带宽情况 - Nethogs Nethogs 是一个终端下的网络流量监控工具可以直观的显示每个进程占用的带宽. 前提条件:安装c++环境 yum install -y gcc-c++ ...

  2. 分布式唯一ID生成器Twitter

    分布式系统中,有一些需要使用全局唯一ID的场景,这种时候为了防止ID冲突可以使用36位的UUID,但是UUID有一些缺点,首先他相对比较长,另外UUID一般是无序的. 有些时候我们希望能使用一种简单一 ...

  3. All shortest paths between a set of nodes

    .big{font-size:larger} .small{font-size:smaller} .underline{text-decoration:underline} .overline{tex ...

  4. 网络信息统计netstat|ss|ip

    1:netstate[弃用] netstat的作用: 需求 原命令 新命令 1:网络连接 netstat -a ss 2:路由表 netstat -r ip route 3:统计接口 netstat ...

  5. Git提交代码的小知识

    1.需要切换到项目目录下并创建一个Repository用于提交代码到这个仓库里 cd /g/....//cd后面有空格,用于进入某个项目文件夹 git init//用于创建Repository 2.添 ...

  6. O015、OpenStack 架构

    参考https://www.cnblogs.com/CloudMan6/p/5340622.html   终于正式进入OpenStack 部分了.   今天开始正式学习OpenStack,OpenSt ...

  7. 107、如何配置 Health Check ? (Swarm14)

    参考https://www.cnblogs.com/CloudMan6/p/8053323.html   容器状态是UP的,那应用就是健康的吗?    不一定   Docker 只能从容器启动进程的返 ...

  8. Wayos网吧路由英雄联盟频繁掉线解决办法

    英雄联盟某些机器瞬间ping值飙升,然后一直掉线重连!研究好久,解决了,经验与大家分享 第一步,在路由器地址后加qos_ext.htm进入qos参数设置页面(如果出现不了设置界面请更新固件).比如:h ...

  9. Clob类型转换为String

    SQL CLOB 是内置类型,它将字符大对象存储为数据库表某一行中的一个列值,使用CHAR来存储数据,如XML文档. 如下是一个Clob转换为String的静态方法,可将其放在自己常用的工具类中,想直 ...

  10. Linux搭建局域网yum源和后期在yum源中更新rpm包方法

    在内网中搭建自己的yum源,可以方便在内网中使用,下面简单介绍搭建局域网yum源的方法和后期更新yum源rpm包的方法. 一.搭建局域网yum源 1.需要在局域网访问,首先需要一个web服务器,比如a ...