「NOIP2011」Mayan游戏
传送门
Luogu
解题思路
爆搜,并考虑几个剪枝。
- 不交换颜色相同的方块(有争议,但是可以过联赛数据 \(Q \omega Q\))
- 左边为空才往左换
- 右边不为空才往右换
因为对于两个相邻方块,右边往左换和左边往右换是等价的,同时还可以保证字典序最小。
细节注意事项
- 爆搜题,你们懂的。。。
参考代码
#include <algorithm>
#include <iostream>
#include <cstring>
#include <cstdlib>
#include <cstdio>
#include <cctype>
#include <cmath>
#include <ctime>
#define rg register
using namespace std;
template < typename T > inline void read(T& s) {
s = 0; int f = 0; char c = getchar();
while (!isdigit(c)) f |= c == '-', c = getchar();
while (isdigit(c)) s = s * 10 + (c ^ 48), c = getchar();
s = f ? -s : s;
}
int n, a[10][10], la[10][10][10], ans[10][10], mark[10][10];
inline bool remv() {
int flag = 0;
for (rg int i = 1; i <= 5; ++i)
for (rg int j = 1; j <= 7; ++j)
if (a[i][j]) {
if (i > 1 && i < 5 && a[i][j] == a[i - 1][j] && a[i][j] == a[i + 1][j])
flag = 1, mark[i][j] = mark[i - 1][j] = mark[i + 1][j] = 1;
if (j > 1 && j < 7 && a[i][j] == a[i][j - 1] && a[i][j] == a[i][j + 1])
flag = 1, mark[i][j] = mark[i][j - 1] = mark[i][j + 1] = 1;
}
if (!flag) return 0;
for (rg int i = 1; i <= 5; ++i)
for (rg int j = 1; j <= 7; ++j)
if (mark[i][j])
mark[i][j] = 0, a[i][j] = 0;
return 1;
}
inline void upt() {
for (rg int i = 1; i <= 5; ++i) {
int s = 0;
for (rg int j = 1; j <= 7; ++j) {
if (!a[i][j]) ++s;
else if (s) a[i][j - s] = a[i][j], a[i][j] = 0;
}
}
}
inline void mv(int i, int j, int t) {
swap(a[i][j], a[i + t][j]);
do { upt(); } while (remv());
}
inline bool check() {
for (rg int i = 1; i <= 5; ++i)
if (a[i][1]) return 0;
return 1;
}
inline void dfs(int x) {
if (check()) {
for (rg int i = 1; i < x; ++i)
printf("%d %d %d\n", ans[0][i], ans[1][i], ans[2][i]);
exit(0);
}
if (x > n) return;
memcpy(la[x], a, sizeof a);
for (rg int i = 1; i <= 5; ++i)
for (rg int j = 1; j <= 7; ++j)
if (a[i][j]) {
if (i < 5 && a[i + 1][j] != a[i][j]) {
mv(i, j, 1);
ans[0][x] = i - 1, ans[1][x] = j - 1, ans[2][x] = 1;
dfs(x + 1);
memcpy(a, la[x], sizeof la[x]);
ans[0][x] = 0, ans[1][x] = 0, ans[2][x] = 0;
}
if (i > 1 && a[i - 1][j] == 0) {
mv(i, j, -1);
ans[0][x] = i - 1, ans[1][x] = j - 1, ans[2][x] = -1;
dfs(x + 1);
memcpy(a, la[x], sizeof la[x]);
ans[0][x] = 0, ans[1][x] = 0, ans[2][x] = 0;
}
}
}
int main() {
#ifndef ONLINE_JUDGE
freopen("in.in", "r", stdin);
#endif
read(n);
for (rg int i = 1; i <= 5; ++i)
for (rg int j = 1; j <= 8; ++j) {
read(a[i][j]); if (a[i][j] == 0) break;
}
dfs(1);
puts("-1");
return 0;
}
完结撒花 \(qwq\)
「NOIP2011」Mayan游戏的更多相关文章
- 一本通1648【例 1】「NOIP2011」计算系数
1648: [例 1]「NOIP2011」计算系数 时间限制: 1000 ms 内存限制: 524288 KB [题目描述] 给定一个多项式 (ax+by)k ,请求出多项式展开后 x ...
- 【noip2011】Mayan游戏
题解: 刷了一天的noip啊 做了10题! 突然找回了做马拉松的感觉- - 我中午竟然放弃治疗去看视频 做到晚上累得都快挂了 用电脑放一些rock 把音乐当咖啡硬撑下来 但是还是没能刷3届 唉 显然速 ...
- 「Githug」Git 游戏通关流程
Githug 他喵的这是个啥!?难道不是 GitHub 拼错了么,和 Git 什么关系? 和游戏又有什么关系? 其实,他的元身在这里:https://github.com/Gazler/githug ...
- 【LOJ】#2067. 「SDOI2016」硬币游戏
题解 c一样的就是一个独立的游戏 我们对于2和3的指数 sg[i][j] 表示\(c \cdot 2^i \cdot 3^j\)的棋子,只有这个硬币是反面,翻转的硬币是正面的sg值 枚举sg函数所有可 ...
- @loj - 2004@ 「SDOI2017」硬币游戏
目录 @description@ @solution@ @accepted code@ @details@ @description@ 周末同学们非常无聊,有人提议,咱们扔硬币玩吧,谁扔的硬币正面次数 ...
- 题解 「HDU6403」卡片游戏
link Description 桌面上摊开着一些卡牌,这是她平时很爱玩的一个游戏.如今卡牌还在,她却不在我身边.不知不觉,我翻开了卡牌,回忆起了当时一起玩卡牌的那段时间. 每张卡牌的正面与反面都各有 ...
- 题解 「SDOI2017」硬币游戏
题目传送门 Description 周末同学们非常无聊,有人提议,咱们扔硬币玩吧,谁扔的硬币正面次数多谁胜利. 大家纷纷觉得这个游戏非常符合同学们的特色,但只是扔硬币实在是太单调了. 同学们觉得要加强 ...
- 【LOJ 2004】「SDOI2017」硬币游戏
LOJ 2004 100pts 首先我们肯定要建AC自动机的.. 那么这题就肯定是个AC自动机上\(dp\). 所以想想状态. 首先如果我们把状态设成这样行不行: \(dp(i)\)表示匹配到了i节点 ...
- 【LOJ】#2182. 「SDOI2015」寻宝游戏
题解 终于了解怎么动态维护虚树了 就是把点按照dfs序排个序啊 这道题显然是求虚树上所有边长的两倍 我们把dfs序排完序,相邻两个点加上路径长(包括首尾),删除的时候删一个点减去它到两边再加上新近相邻 ...
随机推荐
- 前x个数据中至少有m个元素最小值与最大值之差不超过K
题意 给一组数据,从左到右开始,寻找最小的x,使得第1个元素到第x个元素中,至少存在m个数据,最小值与最大值之差不超过K. INPUT 第一行是T,代表数据组数 每组数据的第一行是三个整数,n.m.k ...
- WinForm开发(4)——使用Visual-Studio-2010-打包安装程序
打包程序: 1,解决方案—右键菜单“添加”—新建项目—其他项目类型—安装和部署—Visual Studio Installer—安装项目,输入名称Setup1,点“确定” 2,添加开始程序中的文件夹: ...
- 吴裕雄 python 神经网络——TensorFlow训练神经网络:MNIST最佳实践
import os import tensorflow as tf from tensorflow.examples.tutorials.mnist import input_data INPUT_N ...
- vue调试工具vue-devtools安装及使用方法
vue调试工具vue-devtools安装及使用方法 https://www.jb51.net/article/150335.htm 本文主要介绍 vue的调试工具 vue-devtools 的安装和 ...
- ➡️➡️➡️IELTS speaking by simon
目录 p1 课程概述 p2 speaking part1, intro, warm up introduction questions then 4 questions about one topic ...
- 04在eclipse当中使用gitee
一.使用Bash连接GitHub时作了哪些事情 1.生成公钥 2.在GitHub上配置SSHKEY 3.创建关联 4.关联远程仓库 5.向远程仓库推送数据 6.拉取数据 二.把项目分享到gitee ...
- 软件工程 - Test-Driven Development (TDD),测试驱动开发
参考 https://baike.baidu.com/item/%E6%B5%8B%E8%AF%95%E9%A9%B1%E5%8A%A8%E5%BC%80%E5%8F%91/3328831?fr=al ...
- UIKeyWindow的设置
新建一个纯代码iOS项目,需要对AppDelegate文件和项目的Info.plist文件做一番配置. 第一步:将Info.plist中的下面两项的value删除掉(保留空字符串),如下图 第二步:在 ...
- 为PHP开发搭建环境
为了能在自己的电脑上(mac OS系统)开始编写PHP代码并完成运行,需要有: 1.安装Web服务器 2.安装PHP 3.安装数据库,比如MySQL 4.一个PHP的IDE 为了上面所提到的1~3步的 ...
- python面试题手动总结答案锦集
数据类型 字符串 1.列举python中的基本数据类型 数字:int 布尔值:bool 字符串:str 列表:list 元组:tuple 字典:dict 集合:set 然后我们需要了解一些运算符,应为 ...