UVA 716 - Commedia dell' arte

题目链接

题意:给定一个三维的n数码游戏,要求变换为按顺序,并且最后一个位置是空格,问能否变换成功

思路:和二维的判定方法一样,因为z轴移动,等于交换N^2 - 1次,y轴移动等于交换N - 1次,x轴移动不变,逆序对的奇偶性改变方式不变。

那么n为偶数的时候,逆序对为偶数可以,为奇数不行
n为奇数时候,看空格位置的y轴和z轴分别要走的步数和逆序对的奇偶性相不相同,相同可以,不相同步行

代码:

#include <cstdio>
#include <cstring>const int N = 1000005;typedef long long ll;int t, n, a[N], save[N], v;ll cal(int *a, int l, int r) {if (l >= r) return 0;int mid = (l + r) / 2;int sl = l, sr = r;ll ans = cal(a, l, mid) + cal(a, mid + 1, r);int tmp = mid; mid++;for (int i = l; i <= r; i++) {if (l <= tmp && mid <= r) {if (a[l] <= a[mid]) save[i] = a[l++];else {ans += mid - i;save[i] = a[mid++];}}else if (l <= tmp) save[i] = a[l++];else if (mid <= r) save[i] = a[mid++];}for (int i = sl; i <= sr; i++)a[i] = save[i];return ans;
}bool judge() {ll nx = cal(a, 0, n * n * n - 2);if (n&1) {if (nx&1) return false;}else {int z[3];for (int i = 0; i < 3; i++) {z[i] = v % n;v /= n;}ll bu = 2 * n - 2 - z[2] - z[1];if ((bu^nx)&1) return false;}return true;
}int main() {scanf("%d", &t);while (t--) {scanf("%d", &n);int flag = 0;for (int k = 0; k < n; k++) {for (int i = 0; i < n; i++) {for (int j = 0; j < n; j++) {int now = n * n * k + n * i + j - flag;scanf("%d", &a[now]);if (a[now] == 0) {v = now;flag = 1;}}}}if (judge()) printf("Puzzle can be solved.\n");else printf("Puzzle is unsolvable.\n");}return 0;
}

UVA 716 - Commedia dell' arte(三维N数码问题)相关推荐

  1. uva 716 - Commedia dell' arte(置换)

    题目链接:uva 716 - Commedia dell' arte 题目大意:给定一个三维的八数码,0表示空的位置,问说是否可以排回有序序列. 解题思路:对于n为奇数的情况,考虑三维八数码对应以为状 ...

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

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

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

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

  4. ZOJ Problem Set - 2004 Commedia dell'arte

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

  5. POJ 1507 Commedia dell' arte 未完成

  6. 八数码问题可解性及扩展

    对于给定八数码棋局的初始状态,我们的目标是通过交换空格与其相邻棋子使棋盘达到目标状态. 其中,游戏规则是只能交换空格与其上下左右四个方向的相邻棋子. 假设棋局目标状态为如下形式:(A.B.C.D.E. ...

  7. 八数码问题-8puzzle

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

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

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

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

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

最新文章

  1. Clojure入门指南(Getting Started)
  2. STM32 基础系列教程 9 – 串口通信
  3. 时频分析:短时傅里叶变换实现(1)
  4. Python-Numpy的tile函数
  5. windows重绘机制原理
  6. VS插件的开发 - Visual Studio Addin
  7. 企业实战|企业FTP搭建
  8. radiobutton模拟tab点击效果
  9. PAIP.通过公共网络传递秘密信息.txt (包括语音和文字)
  10. C++ 后台开发面试时一般考察什么?
  11. 拼多多狂砸百亿补贴的iphone是真的吗?
  12. 2.4 混合策略和混合策略纳什均衡
  13. 我的Windows实用软件清单
  14. 为电商而生的知识图谱,如何感应用户需求? 1
  15. 基于verilog的数字万年历时钟设计
  16. Mysql 统计每周,半个月的数据
  17. EDM模板设计:教您设计三种独特的邮件营销模板
  18. docker-desktop和docer历史版本下载
  19. springmvc的工作原理
  20. [图像] 金字塔模型

热门文章

  1. linux--代码对比工具Meld Diff
  2. Centos 7开启3306端口
  3. opentsdb java开发_安装openTSDB
  4. 通过Mac连接到Edsion并作相关配置
  5. SpringCloud微服务前后端分离开发中出现的弱智问题之(不支持当前请求方法)
  6. 小程序的页面生成图片分享朋友圈
  7. 苹果M1版Mac笔记本电脑可运行iPad应用了
  8. 【python】使用pyQT5显示网页
  9. html中的div怎么隐藏显示出来,js实现元素div/ul li的显示与隐藏
  10. 阿里云 IP 地理位置库(淘宝IP库)实践(后篇)