[Luogu] Mayan游戏
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游戏的更多相关文章
- [Luogu 1312] noip11 Mayan游戏
[Luogu 1312] noip11 Mayan游戏 Problem: Mayan puzzle是最近流行起来的一个游戏.游戏界面是一个 7 行5 列的棋盘,上面堆放着一些方块,方块不能悬空堆放,即 ...
- [题目] Luogu P1312 Mayan游戏
题面 题目描述 $ Mayan puzzle $是最近流行起来的一个游戏.游戏界面是一个 \(7行 \times 5列\)的棋盘,上面堆放着一些方块,方块不能悬空堆放,即方块必须放在最下面一行,或者放 ...
- Luogu P1312 Mayan游戏(搜索)
P1312 Mayan游戏 题意 题目描述 Mayan puzzle是最近流行起来的一个游戏.游戏界面是一个\(7\)行\(\times 5\)列的棋盘,上面堆放着一些方块,方块不能悬空堆放,即方块必 ...
- NOIP2011 Mayan游戏
3 Mayan游戏 题目描述 Mayan puzzle是最近流行起来的一个游戏.游戏界面是一个 7 行5 列的棋盘,上面堆放着一些方块,方块不能悬空堆放,即方块必须放在最下面一行,或者放在其他方块之上 ...
- noip提高组2011 Mayan游戏
Mayan游戏 描述 Mayan puzzle是最近流行起来的一个游戏.游戏界面是一个7行5列的棋盘,上面堆放着一些方块,方块不能悬空堆放,即方块必须放在最下面一行,或者放在其他方块之上.**游戏通关 ...
- $Mayan$游戏
\(Mayan\)游戏 好啊,一年(半年)来的梦魇,终于结束了. 其实我从来没料到整体竟然会如此暴力--做的时候机房里冷得很,感觉晕晕乎乎地做完了,晕晕乎乎地调了好久,晕晕乎乎地听(看了题解的)\(q ...
- 洛谷P1312 Mayan游戏
P1312 Mayan游戏 题目描述 Mayan puzzle是最近流行起来的一个游戏.游戏界面是一个 7 行5 列的棋盘,上面堆放着一些方块,方块不能悬空堆放,即方块必须放在最下面一行,或者放在其他 ...
- luoguP1312 Mayan游戏 题解(NOIP2011)
luoguP1312 Mayan游戏 题目 #include<bits/stdc++.h> #define ll long long #define rg register #define ...
- 洛谷P1312 [NOIP2011提高组Day1T3]Mayan游戏
Mayan游戏 题目描述 Mayan puzzle是最近流行起来的一个游戏.游戏界面是一个 7 行5 列的棋盘,上面堆放着一些方块,方块不能悬空堆放,即方块必须放在最下面一行,或者放在其他方块之上.游 ...
随机推荐
- jquery【点击】导航按钮的来回切换
先获取元素的属性值,根据属性值进行判断,点击时对属性进行设置 <i class="layui-icon layui-icon-shrink-right" id="n ...
- S03_CH02_AXI_DMA PL发送数据到PS
S03_CH02_AXI_DMA PL发送数据到PS 1.1概述 本课程的设计原理分析. 本课程循序渐进,承接<S03_CH01_AXI_DMA_LOOP 环路测试>这一课程,在DATA ...
- C++反汇编第一讲,不同作用域下的构造和析构的识别
目录大纲: 1.全局(静态)对象的识别,(全局静态全局一样的,都是编译期间检查,所以当做全局对象看即可.) 1.1 探究本质,理解构造和析构的生成,以及调用方式(重要,如果不想知道,可以看总结.) 2 ...
- 作业13:Map相关知识点(一)
一 Map相关类图 二 Map接口 1 Map接口中的方法 jdk 方法名 简单描述 put(K,V):V 添加value,当Key对应无值,返回null;有值则返回上一个值.(覆盖式,可以反复覆盖前 ...
- c# 图文添加文字斜水印 优化
之前一篇给图片加水印的功能,加出来水印的图片位置有一点问题,并且如果图片分辨率有变动的话,水印会有层次不齐的问题. 目前只能优化到增加一条居中显示的斜水印,在不同分辨率不同大小的图片中,都能保证文字水 ...
- java获取类的3种方式
1.Class.forName("全类名"):将字节吗文件加载进内存,返回Class对象,多用于配指文件,将类名定义在配置文件中,便于利用java的反射机制生成类对象,加载类. / ...
- Jboss未授权访问部署木马 利用exp
查看系统名称 java -jar jboss_exploit_fat.jar -i http://www.any.com:8080/invoker/JMXInvokerServlet get jbos ...
- shell脚本——字符串
printf printf "%-10s %-10s %-10s\n" NO Name Height printf "%-10s %-10s %-10d\n&quo ...
- 桌面Ubuntu卡死解决方案
通常情况下,我们用桌面Ubuntu会遇到卡住的的情况,我们一般会进行强制关机处理,但其实还有另一种操作,不用强制关机. 切换到tty模式,执行命令pkill X;start X;就能重新进入桌面,不用 ...
- 快速排序详解(lomuto划分快排,hoare划分快排,classic经典快排,dualpivot双轴快排源码)
目录 快速排序(lomuto划分快排,hoare划分快排,classic经典快排,dualpivot双轴快排) 一.快速排序思想 二.划分思想 三.测试用例 快速排序(lomuto划分快排,hoare ...