[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 列的棋盘,上面堆放着一些方块,方块不能悬空堆放,即方块必须放在最下面一行,或者放在其他方块之上.游 ...
随机推荐
- 怎样设置cookie的到期时间
1. 使用Cookie的: Expires 属性. 它可以设置cookie的过期时间. 下面的代码表示id这条cookie的过期时间是2015年10月21日早上7点28分; Set-Cookie: i ...
- C# DataTable根据字段排序
DataTable dt = new DataTable(); dt.Columns.Add("Name"); dt.Columns.Add("Age");// ...
- Sql Server 分区演练
USE [master] GO if exists (select * from sys.databases where name = 'Test_1') drop database Test_1 G ...
- 安装HAXM报错:failed to configure driver unknown error. failed to open driver 并提示数字签证不可用
1.安装微软补丁:https://www.microsoft.com/en-us/download/confirmation.aspx?id=46148 2.重启后重新安装HAXM
- express相关操作
1. 安装应用生成器npm install express-generator –g 2. 生成项目Express --view=ejs myapp 3. 进入项目安装依赖包 npm in ...
- 前端必学TypeScript之第一弹,st基础类型!
TypeScript 是微软开发的 JavaScript 的超集,TypeScript兼容JavaScript,可以载入JavaScript代码然后运行.TypeScript与JavaScript相比 ...
- git 常用命令操作
目录 一.用户和邮箱 用户和邮箱的作用 查看用户名和邮箱地址 修改用户名和邮箱地址 用户名和邮箱地址的作用 用户名和邮箱地址是本地git客户端的一个变量,不随git库而改变. 每次commit都会用用 ...
- const成员函数和const对象
从成员函数说起 在说const成员函数之前,先说一下普通成员函数,其实每个成员函数都有一个隐形的入参:T *const this. int getValue(T *const this) { retu ...
- Spark的Shuffle
0. Shuffle概述 要理解什么是Shuffle,首先介绍大数据与分布式.我们知道大数据的存储是分布式存储,大数据的计算框架是分布式的计算框架.分布式必然存在数据的交互传输,简言之Shuffle就 ...
- Linux部署tomcat服务常用命令
cd / 转到根目录 ps -ef|grep tomcat查看进程 ./bin/shutdown.sh 关闭 rm -r logs/* 清除日志 ps -ef|grep tomcat查看进程 ./bi ...