题目链接:uva 716 - Commedia dell' arte

题目大意:给定一个三维的八数码,0表示空的位置,问说是否可以排回有序序列。

解题思路:对于n为奇数的情况,考虑三维八数码对应以为状态下去除0的时候逆序对数,偶数的情况下,考虑将0的位置转移到(n,n,n)位置后对应序列的逆序对数。如果逆序对数为偶数即为可以,奇数不可以。

#include <cstdio>
#include <cstring>
#include <algorithm>using namespace std;
typedef long long ll;
const int maxn = 1e6+5;int n, arr[maxn], t[maxn];
int x, y, z;ll merge_sort (int l, int r, int* a, int* b) {if (l == r)return 0;ll ret = 0;int mid = (r + l) / 2;int p = l, q = mid+1, mv = l;ret = merge_sort(l, mid, a, b) + merge_sort(mid + 1, r, a, b);while (p <= mid || q <= r) {if (q > r || (p <= mid && a[p] < a[q]))b[mv++] = a[p++];else {ret += mid - p + 1;b[mv++] = a[q++];}}for (int i = l; i <= r; i++)a[i] = b[i];return ret;
}bool judge () {if (n&1) {ll ret = merge_sort(0, n*n*n-1, arr, t) - (z * n * n + x * n + y - 1);return (ret&1) == 0;}while (z != n - 1) {int p = z * n * n + x * n + y;z++;int q = z * n * n + x * n + y;swap(arr[p], arr[q]);}while (x != n - 1) {int p = z * n * n + x * n + y;x++;int q = z * n * n + x * n + y;swap(arr[p], arr[q]);}while (y != n - 1) {int p = z * n * n + x * n + y;y++;int q = z * n * n + x * n + y;swap(arr[p], arr[q]);}ll ret = merge_sort(0, n*n*n-2, arr, t);return (ret&1) == 0;
}int main () {int cas;scanf("%d", &cas);while (cas--) {scanf("%d", &n);for (int k = 0; k < n; k++) {int Z = k * n * n;for (int i = 0; i < n; i++) {int X = i * n;for (int j = 0; j < n; j++) {int tmp = Z + X + j;scanf("%d", &arr[tmp]);if (arr[tmp] == 0) {x = i; y = j; z = k;}}}}printf("%s\n", judge() ? "Puzzle can be solved." : "Puzzle is unsolvable.");}return 0;
}

uva 716 - Commedia dell' arte(置换)相关推荐

  1. UVA 716 - Commedia dell' arte(三维N数码问题)

    UVA 716 - Commedia dell' arte 题目链接 题意:给定一个三维的n数码游戏,要求变换为按顺序,并且最后一个位置是空格,问能否变换成功 思路:和二维的判定方法一样,因为z轴移动 ...

  2. UVA 716(Commedia dell' arte-三维八数码)

    题意:给一个3维八数码(长宽高为 n≤100 n \le100),问能否恢复原状? 考虑2维八数码 给一个网上的结论 八数码问题的有解无解的结论: 一个状态表示成一维的形式,求除0之外所有数字的逆序数 ...

  3. UVALive - 5542 Commedia dell' arte 三维n数码问题

    其实,,,不管二维三维的这类问题,本质都是一个置换群的对换问题 一置换中的一个长度为k的循环,至少需要k-1次对换才能恢复 对换有个性质就是,一个对换不管变奇偶性都是相同的 我们来看这道题,,其实移动 ...

  4. POJ 1507 Commedia dell' arte 未完成

  5. ZOJ Problem Set - 2004 Commedia dell'arte

    求解N*N*N多维棋盘问题,解题思路参考:再论八数码 求解逆序数参考:逆序数的几种求法 下面是C++源代码 #include<iostream> #include<string.h& ...

  6. UVA 1156 - Pixel Shuffle(模拟+置换)

    UVA 1156 - Pixel Shuffle 题目链接 题意:依据题目中的变换方式,给定一串变换方式,问须要运行几次才干回复原图像 思路:这题恶心的一比,先模拟求出一次变换后的相应的矩阵,然后对该 ...

  7. POJ的题目分类(两个版本)

    版本一: 简单题 1000A+B Problem 1001Exponentiation 1003 Hangover 1004 Financial Management 1005 I Think I N ...

  8. POJ前面的题目算法思路【转】

    1000 A+B Problem 送分题 49% 2005-5-7 1001 Exponentiation 高精度 85% 2005-5-7 1002 487-3279 n/a 90% 2005-5- ...

  9. 八数码问题-8puzzle

    完整代码及测试数据 完整代码及测试数据 问题简介 八数码:是指在3x3的矩阵中,其中有8个格子放置成1-8,剩下一个格子是空格.能够移动和空格相邻的格子到空格,直到这个矩阵满足每一行依次从左到右读取是 ...

最新文章

  1. spring面试重点
  2. vue实现竖式步骤条_手把手教你实现一个 Vue 进度条组件!
  3. Qt 程序打包发布总结
  4. React-leaflet在ant-design pro中的基本使用
  5. 第一个十年,我从教师转行为web程序员,下一个十年呢?
  6. 浏览器网页操作 EXCEL 示例
  7. 计算机运行命令jar,jar文件打开教程
  8. 图像降噪有哪些方法?
  9. 阿里巴巴国际站新手运营攻略
  10. word2007制作目录
  11. 数据挖掘(一)A-Priori
  12. Browsers简介
  13. pe修改服务器2003密码,PE修改Windows密码
  14. 教程:Nodejs大漠插件开发游戏脚本实战
  15. git进阶 | 03 -如何彻底删除git中的大文件
  16. java考研方向,值得推荐!
  17. 海外跨境直播面临的难题及解决方案
  18. 在javaweb中将excel表格导入存放数据库
  19. 猿创征文|计算机学生必须掌握的学习工具
  20. 卷土、玄雨入围第四届橙瓜网络文学奖十佳科幻大神,方想暂排第一

热门文章

  1. QQ发消息出现红色感叹号,害得我以为好友都把我删了?
  2. 韩果社 韩国elago三星i9220 Galaxy Note烤漆外壳 手机壳 手机套-淘宝网
  3. java实现整数1-3999转罗马数字
  4. 案例研究:利用Grails搭建Feedlr.com网站
  5. 第二章:第一节数据清洗及特征处理-课程
  6. 辨析|深度学习与机器学习的基本区别
  7. 图像处理用什么神经网络,人工神经网络图像识别
  8. 全球及中国变压器行业研究及十四五规划分析报告(2022)
  9. Job for mysqld.service failed because the control process exited with error code. See “systemctl sta
  10. okio 的使用及源码分析