https://www.luogu.org/problemnew/show/P1312

太恶心了

  1. #include <cstdio>
  2. #include <algorithm>
  3. #include <cmath>
  4. #include <cstring>
  5. #include <string>
  6. #include <iostream>
  7.  
  8. using namespace std;
  9. const int N = ;
  10.  
  11. struct Node{int x, y, ho;} answer[N];
  12. int n;
  13. int a[N][N];
  14.  
  15. inline int read() {
  16. int x = ; char c = getchar();
  17. while(c < '' || c > '')c = getchar();
  18. while(c >= '' && c <= '')x = x * + c - '', c = getchar();
  19. return x;
  20. }
  21.  
  22. void drop() {
  23. int num[N][N];
  24. memset(num, -, sizeof(num));
  25. for(int i = ; i < ; i ++) {
  26. int h = ;
  27. for(int j = ; j < ; j ++) if(a[i][j]) num[i][h ++] = j;
  28. }
  29. for(int i = ; i < ; i ++)
  30. for(int j = ; j < ; j ++)
  31. a[i][j] = num[i][j] == - ? : a[i][num[i][j]];
  32. return ;
  33. }
  34.  
  35. bool empty() {
  36. for(int i = ; i < ; i ++) for(int j = ; j < ; j ++) if(a[i][j]) return ;
  37. return ;
  38. }
  39.  
  40. bool clear() {
  41. bool ret_flag = ;
  42. for(int i = ; i < ; i ++)
  43. for(int j = ; j < ; j ++)
  44. if(a[i][j]) {
  45. int x = i;
  46. while(x < && a[i][j] == a[x + ][j]) x ++;
  47. if(x - i >= ) {
  48. for(int xx = i; xx <= x; xx ++) {
  49. int up = j; int dn = j;
  50. while(a[xx][up + ] == a[i][j] && up < ) up ++;
  51. while(a[xx][dn - ] == a[i][j] && dn > ) dn --;
  52. if(up - dn >= )
  53. for(int y_ = dn; y_ <= up; y_ ++) a[xx][y_] = ;
  54. }
  55. for(int x_ = i; x_ <= x; x_ ++) a[x_][j] = ;
  56. ret_flag = ;
  57. }
  58. }
  59. for(int i = ; i < ; i ++)
  60. for(int j = ; j < ; j ++)
  61. if(a[i][j]) {
  62. int y = j;
  63. while(a[i][y + ] == a[i][j] && y < ) y ++;
  64. if(y - j >= ) {
  65. for(int yy = j; yy <= y; yy ++) {
  66. int lef = i; int rig = i;
  67. while(a[lef - ][yy] == a[i][j] && lef > ) lef --;
  68. while(a[rig + ][yy] == a[i][j] && rig < ) rig ++;
  69. if(rig - lef >= )
  70. for(int x_ = lef; x_ <= rig; x_ ++) a[x_][yy] = ;
  71. }
  72. for(int y_ = j; y_ <= y; y_ ++) a[i][y_] = ;
  73. ret_flag = ;
  74. }
  75. }
  76. if(ret_flag) return ;
  77. else return ;
  78. }
  79.  
  80. void dfs(int tot) {
  81. if(tot > n) {
  82. if(empty()) {
  83. for(int i = ; i <= n; i ++) {
  84. if(answer[i].ho) printf("%d %d %d\n", answer[i].x + , answer[i].y, -);
  85. else printf("%d %d %d\n", answer[i].x, answer[i].y, );
  86. }
  87. exit();
  88. }
  89. return ;
  90. }
  91. int sum[N + ];
  92. memset(sum, , sizeof(sum));
  93. for(int i = ; i < ; i ++) for(int j = ; j < ; j ++) sum[a[i][j]] ++;
  94. for(int i = ; i <= ; i ++) if(sum[i] && sum[i] <= ) return ;
  95. for(int i = ; i < ; i ++)
  96. for(int j = ; j < ; j ++)
  97. if(a[i][j] != a[i + ][j]) {
  98. answer[tot].x = i; answer[tot].y = j; answer[tot].ho = (!a[i][j]);
  99. int tmp[N][N];
  100. memcpy(tmp, a, sizeof(tmp));
  101. swap(a[i][j], a[i + ][j]);
  102. drop();
  103. while(clear()) drop();
  104. dfs(tot + );
  105. answer[tot].x = ; answer[tot].y = ; answer[tot].ho = ;
  106. memcpy(a, tmp, sizeof(a));
  107. }
  108. }
  109.  
  110. int main() {
  111. n = read();
  112. for(int i = ; i < ; i ++) {
  113. for(int j = ; ; j ++) {
  114. a[i][j] = read();
  115. if(!a[i][j]) break;
  116. }
  117. }
  118. dfs();
  119. printf("-1\n");
  120. return ;
  121. }
  122. /*
  123. 3
  124. 1 0
  125. 2 1 0
  126. 2 3 4 0
  127. 3 1 0
  128. 2 4 3 4 0
  129. */

[Luogu] Mayan游戏的更多相关文章

  1. [Luogu 1312] noip11 Mayan游戏

    [Luogu 1312] noip11 Mayan游戏 Problem: Mayan puzzle是最近流行起来的一个游戏.游戏界面是一个 7 行5 列的棋盘,上面堆放着一些方块,方块不能悬空堆放,即 ...

  2. [题目] Luogu P1312 Mayan游戏

    题面 题目描述 $ Mayan puzzle $是最近流行起来的一个游戏.游戏界面是一个 \(7行 \times 5列\)的棋盘,上面堆放着一些方块,方块不能悬空堆放,即方块必须放在最下面一行,或者放 ...

  3. Luogu P1312 Mayan游戏(搜索)

    P1312 Mayan游戏 题意 题目描述 Mayan puzzle是最近流行起来的一个游戏.游戏界面是一个\(7\)行\(\times 5\)列的棋盘,上面堆放着一些方块,方块不能悬空堆放,即方块必 ...

  4. NOIP2011 Mayan游戏

    3 Mayan游戏 题目描述 Mayan puzzle是最近流行起来的一个游戏.游戏界面是一个 7 行5 列的棋盘,上面堆放着一些方块,方块不能悬空堆放,即方块必须放在最下面一行,或者放在其他方块之上 ...

  5. noip提高组2011 Mayan游戏

    Mayan游戏 描述 Mayan puzzle是最近流行起来的一个游戏.游戏界面是一个7行5列的棋盘,上面堆放着一些方块,方块不能悬空堆放,即方块必须放在最下面一行,或者放在其他方块之上.**游戏通关 ...

  6. $Mayan$游戏

    \(Mayan\)游戏 好啊,一年(半年)来的梦魇,终于结束了. 其实我从来没料到整体竟然会如此暴力--做的时候机房里冷得很,感觉晕晕乎乎地做完了,晕晕乎乎地调了好久,晕晕乎乎地听(看了题解的)\(q ...

  7. 洛谷P1312 Mayan游戏

    P1312 Mayan游戏 题目描述 Mayan puzzle是最近流行起来的一个游戏.游戏界面是一个 7 行5 列的棋盘,上面堆放着一些方块,方块不能悬空堆放,即方块必须放在最下面一行,或者放在其他 ...

  8. luoguP1312 Mayan游戏 题解(NOIP2011)

    luoguP1312 Mayan游戏 题目 #include<bits/stdc++.h> #define ll long long #define rg register #define ...

  9. 洛谷P1312 [NOIP2011提高组Day1T3]Mayan游戏

    Mayan游戏 题目描述 Mayan puzzle是最近流行起来的一个游戏.游戏界面是一个 7 行5 列的棋盘,上面堆放着一些方块,方块不能悬空堆放,即方块必须放在最下面一行,或者放在其他方块之上.游 ...

随机推荐

  1. jquery【点击】导航按钮的来回切换

    先获取元素的属性值,根据属性值进行判断,点击时对属性进行设置 <i class="layui-icon layui-icon-shrink-right" id="n ...

  2. S03_CH02_AXI_DMA PL发送数据到PS

    S03_CH02_AXI_DMA PL发送数据到PS 1.1概述 本课程的设计原理分析. 本课程循序渐进,承接<S03_CH01_AXI_DMA_LOOP 环路测试>这一课程,在DATA ...

  3. C++反汇编第一讲,不同作用域下的构造和析构的识别

    目录大纲: 1.全局(静态)对象的识别,(全局静态全局一样的,都是编译期间检查,所以当做全局对象看即可.) 1.1 探究本质,理解构造和析构的生成,以及调用方式(重要,如果不想知道,可以看总结.) 2 ...

  4. 作业13:Map相关知识点(一)

    一 Map相关类图 二 Map接口 1 Map接口中的方法 jdk 方法名 简单描述 put(K,V):V 添加value,当Key对应无值,返回null;有值则返回上一个值.(覆盖式,可以反复覆盖前 ...

  5. c# 图文添加文字斜水印 优化

    之前一篇给图片加水印的功能,加出来水印的图片位置有一点问题,并且如果图片分辨率有变动的话,水印会有层次不齐的问题. 目前只能优化到增加一条居中显示的斜水印,在不同分辨率不同大小的图片中,都能保证文字水 ...

  6. java获取类的3种方式

    1.Class.forName("全类名"):将字节吗文件加载进内存,返回Class对象,多用于配指文件,将类名定义在配置文件中,便于利用java的反射机制生成类对象,加载类. / ...

  7. Jboss未授权访问部署木马 利用exp

    查看系统名称 java -jar jboss_exploit_fat.jar -i http://www.any.com:8080/invoker/JMXInvokerServlet get jbos ...

  8. shell脚本——字符串

    printf printf "%-10s %-10s %-10s\n" NO Name    Height printf "%-10s %-10s %-10d\n&quo ...

  9. 桌面Ubuntu卡死解决方案

    通常情况下,我们用桌面Ubuntu会遇到卡住的的情况,我们一般会进行强制关机处理,但其实还有另一种操作,不用强制关机. 切换到tty模式,执行命令pkill X;start X;就能重新进入桌面,不用 ...

  10. 快速排序详解(lomuto划分快排,hoare划分快排,classic经典快排,dualpivot双轴快排源码)

    目录 快速排序(lomuto划分快排,hoare划分快排,classic经典快排,dualpivot双轴快排) 一.快速排序思想 二.划分思想 三.测试用例 快速排序(lomuto划分快排,hoare ...