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

太恶心了

#include <cstdio>
#include <algorithm>
#include <cmath>
#include <cstring>
#include <string>
#include <iostream> using namespace std;
const int N = ; struct Node{int x, y, ho;} answer[N];
int n;
int a[N][N]; inline int read() {
int x = ; char c = getchar();
while(c < '' || c > '')c = getchar();
while(c >= '' && c <= '')x = x * + c - '', c = getchar();
return x;
} void drop() {
int num[N][N];
memset(num, -, sizeof(num));
for(int i = ; i < ; i ++) {
int h = ;
for(int j = ; j < ; j ++) if(a[i][j]) num[i][h ++] = j;
}
for(int i = ; i < ; i ++)
for(int j = ; j < ; j ++)
a[i][j] = num[i][j] == - ? : a[i][num[i][j]];
return ;
} bool empty() {
for(int i = ; i < ; i ++) for(int j = ; j < ; j ++) if(a[i][j]) return ;
return ;
} bool clear() {
bool ret_flag = ;
for(int i = ; i < ; i ++)
for(int j = ; j < ; j ++)
if(a[i][j]) {
int x = i;
while(x < && a[i][j] == a[x + ][j]) x ++;
if(x - i >= ) {
for(int xx = i; xx <= x; xx ++) {
int up = j; int dn = j;
while(a[xx][up + ] == a[i][j] && up < ) up ++;
while(a[xx][dn - ] == a[i][j] && dn > ) dn --;
if(up - dn >= )
for(int y_ = dn; y_ <= up; y_ ++) a[xx][y_] = ;
}
for(int x_ = i; x_ <= x; x_ ++) a[x_][j] = ;
ret_flag = ;
}
}
for(int i = ; i < ; i ++)
for(int j = ; j < ; j ++)
if(a[i][j]) {
int y = j;
while(a[i][y + ] == a[i][j] && y < ) y ++;
if(y - j >= ) {
for(int yy = j; yy <= y; yy ++) {
int lef = i; int rig = i;
while(a[lef - ][yy] == a[i][j] && lef > ) lef --;
while(a[rig + ][yy] == a[i][j] && rig < ) rig ++;
if(rig - lef >= )
for(int x_ = lef; x_ <= rig; x_ ++) a[x_][yy] = ;
}
for(int y_ = j; y_ <= y; y_ ++) a[i][y_] = ;
ret_flag = ;
}
}
if(ret_flag) return ;
else return ;
} void dfs(int tot) {
if(tot > n) {
if(empty()) {
for(int i = ; i <= n; i ++) {
if(answer[i].ho) printf("%d %d %d\n", answer[i].x + , answer[i].y, -);
else printf("%d %d %d\n", answer[i].x, answer[i].y, );
}
exit();
}
return ;
}
int sum[N + ];
memset(sum, , sizeof(sum));
for(int i = ; i < ; i ++) for(int j = ; j < ; j ++) sum[a[i][j]] ++;
for(int i = ; i <= ; i ++) if(sum[i] && sum[i] <= ) return ;
for(int i = ; i < ; i ++)
for(int j = ; j < ; j ++)
if(a[i][j] != a[i + ][j]) {
answer[tot].x = i; answer[tot].y = j; answer[tot].ho = (!a[i][j]);
int tmp[N][N];
memcpy(tmp, a, sizeof(tmp));
swap(a[i][j], a[i + ][j]);
drop();
while(clear()) drop();
dfs(tot + );
answer[tot].x = ; answer[tot].y = ; answer[tot].ho = ;
memcpy(a, tmp, sizeof(a));
}
} int main() {
n = read();
for(int i = ; i < ; i ++) {
for(int j = ; ; j ++) {
a[i][j] = read();
if(!a[i][j]) break;
}
}
dfs();
printf("-1\n");
return ;
}
/*
3
1 0
2 1 0
2 3 4 0
3 1 0
2 4 3 4 0
*/

[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. 第8章:LeetCode--算法:二叉树的创建、遍历、删除、求高度

    创建> 需要给定一个root的key,所有小于这个key的放到左边,大于key的放到右边, 比如vector<int> tree = {5,2,7,1,9,3,8},最后的树: 5 ...

  2. 如何找到程序的真正入口mainCRTStartup

    相信大家都知道以为程序的入口为main函数,但是程序的真正的入口不是main而是mainCRTStartup,那么我们如何找到他的地址呢? 先用第一种方法,就是直接代码显示 #include<s ...

  3. hdu 1506 最大子矩阵面积

    //写动态规划的题目 要把主要问题提炼出来 这里的问题就是求area=(j-k+1)*a[i]  如果找到j k是解决这个题目的关键 这里暴力求肯定是要超时的 这里用dp来优化 #include< ...

  4. ASP.NET Core 2.0 中读取 Request.Body 的正确姿势

    原文:ASP.NET Core 中读取 Request.Body 的正确姿势 ASP.NET Core 中的 Request.Body 虽然是一个 Stream ,但它是一个与众不同的 Stream ...

  5. c# 并行计算 Parallel

    //多重认证 Parallel.Invoke(() => { jianYanResult = new VerifiedMobileService().CheckMobileFun(request ...

  6. Tomat服务器学习

    Tomat服务器学习 使用的是Redhat版本的Tomcat 目录结构 bin:可执行文件 conf:配置文件 lib:tomcat运行时依赖的jar包 logs:日志文件 temp:临时文件 web ...

  7. splice与slice区别

    共同点:均是删除数组元素并返回结果. 区别:splice会改变原数组,而slice不会.并且splice会导致数组塌陷. 数组塌陷:使用splice删除元素时,剩余的数组元素索引的顺讯会改变. let ...

  8. sql server 语句书写注意事项

    1  Between在某些时候比IN 2 在必要是对全局或者局部临时表创建索引,有时能够提高速度,但不是一定会这样,因为索引也耗费大量的资源.他的创建同是实际表一样 3 尽量少用视图,它的效率低.对视 ...

  9. Oracle---PL/SQL的学习

    PL/SQL程序 一.定义 declare 说明部分 begin 语句序列(DML语句) exception 例外处理语句 end; 二. 变量和常量说明 a) 说明变量(char,varchar2, ...

  10. MSP432 BSL流程(UART)

    升级流程 PC程序会解析脚本中的命令,根据命令码做相应的操作.数据来自于命令后的文件(当前目录下的数据文件) # cat script_P4xx_uart.txt LOG //记录日志 MODE P4 ...