P1312 Mayan游戏

这道题跟斗地主都是大模拟啊!稍微挂一点可能就爆零了!

图肯定能存,直接二维数组扔进去即可。

然后套dfs模板,搜索就先照那样搜。

核心操作有两个:一个是判断那些块可以消掉,一个是把那些可以消的消了。

第一个操作的核心代码是这样的:

for(int i = 1; i <= 5; i++) {for(int j = 1; j <= 7; j++) {if(G[i][j] && i - 1 >= 1 && i + 1 <= 5 && G[i][j] == G[i + 1][j] && G[i][j] == G[i - 1][j]) {flag = true;vis[i][j] = vis[i - 1][j] = vis[i + 1][j] = true;for(int k = i - 2; k >= 1; k--) {if(G[i][j] == G[k][j]) vis[k][j] = true;else break;}for(int k = i + 2; k <= 5; k++) {if(G[i][j] == G[k][j]) vis[k][j] = true;else break;}}if(G[i][j] && j - 1 >= 1 && j + 1 <= 7 && G[i][j] == G[i][j - 1] && G[i][j] == G[i][j + 1]) {flag = true;vis[i][j] = vis[i][j - 1] = vis[i][j + 1] = true;for(int k = j - 2; k >= 1; k--) {if(G[i][j] == G[i][k]) vis[i][k] = true;else break;}for(int k = j + 2; k <= 7; k++) {if(G[i][j] == G[i][k]) vis[i][k] = true;else break;}}}
}

个人认为没办法用dfs去找可以消的块,于是就用了这种暴力操作。

第二个操作比较麻烦,稍微写错就爆零了。。。

正确的解决思路是把可以消的点先全部弄掉,变成一副悬空的状态。

之后再遍历每一列,再从下往上遍历,记录当前遇到了几个空气,直接替换,原位置变成空气即可。

还有一点难发现的:当新状态出来之后,必须先掉下来,再判断能否消除。

然后两个部分就没什么问题了。

但是这样会TLE。我们需要剪枝!

  1. 交换相同方块时,剪枝!
  2. 一个方块向左交换时,如果左边有方块,剪枝!这时让那个方块向右交换更优。

代码:

/*************************************************************************@Author: Garen@Created Time : Wed 30 Jan 2019 12:53:57 PM CST@File Name: P1312.cpp@Description:************************************************************************/
#include<bits/stdc++.h>
using std::cin;
using std::cout;
using std::endl;
const int maxn = 6, maxm = 8;
int G[maxn][maxm];
int backup[maxn][maxn][maxm];
struct Nodes {int x, y, g;Nodes(int x, int y, int g): x(x), y(y), g(g) {}
};
std::vector<Nodes> answers;
bool vis[maxn][maxm];
int n;void copy_one(int t) {for(int i = 1; i <= 5; i++) for(int j = 1; j <= 7; j++) backup[t][i][j] = G[i][j];
}
void copy_two(int t) {for(int i = 1; i <= 5; i++) for(int j = 1; j <= 7; j++) G[i][j] = backup[t][i][j];
}
bool find() {bool flag = false;for(int i = 1; i <= 5; i++) {for(int j = 1; j <= 7; j++) {if(G[i][j] && i - 1 >= 1 && i + 1 <= 5 && G[i][j] == G[i + 1][j] && G[i][j] == G[i - 1][j]) {flag = true;vis[i][j] = vis[i - 1][j] = vis[i + 1][j] = true;for(int k = i - 2; k >= 1; k--) {if(G[i][j] == G[k][j]) vis[k][j] = true;else break;}for(int k = i + 2; k <= 5; k++) {if(G[i][j] == G[k][j]) vis[k][j] = true;else break;}}if(G[i][j] && j - 1 >= 1 && j + 1 <= 7 && G[i][j] == G[i][j - 1] && G[i][j] == G[i][j + 1]) {flag = true;vis[i][j] = vis[i][j - 1] = vis[i][j + 1] = true;for(int k = j - 2; k >= 1; k--) {if(G[i][j] == G[i][k]) vis[i][k] = true;else break;}for(int k = j + 2; k <= 7; k++) {if(G[i][j] == G[i][k]) vis[i][k] = true;else break;}}}}if(!flag) return false;for(int i = 1; i <= 5; i++) {for(int j = 1; j <= 7; j++) {if(vis[i][j]) {vis[i][j] = G[i][j] = 0;}}}return true;
}
void update() {for(int i = 1; i <= 5; i++) {int now = 0;for(int j = 1; j <= 7; j++) {if(!G[i][j]) now++;else {if(!now) continue;G[i][j - now] = G[i][j]; G[i][j] = 0;}}}
}
bool empty() {for(int i = 1; i <= 5; i++) if(G[i][1]) return false;return true;
}
void dfs(int t) {if(t == n) {if(empty()) {for(auto it : answers) cout << it.x << ' ' << it.y << ' ' << it.g << endl;exit(0);}return;}copy_one(t);for(int i = 1; i <= 5; i++) {for(int j = 1; j <= 7; j++) {if(G[i][j]) {// rightif(i + 1 <= 5 && G[i][j] != G[i + 1][j]) {std::swap(G[i][j], G[i + 1][j]);answers.push_back(Nodes(i - 1, j - 1, 1));update();while(find()) update();dfs(t + 1);copy_two(t);answers.pop_back();}// leftif(i - 1 >= 1 && G[i - 1][j] == 0) {std::swap(G[i][j], G[i - 1][j]);answers.push_back(Nodes(i - 1, j - 1, -1));update();while(find()) update();dfs(t + 1);copy_two(t);answers.pop_back();}}}}
}
int main() {cin >> n;for(int i = 1; i <= 5; i++) {int temp;for(int j = 1; ; j++) {cin >> temp;if(temp) G[i][j] = temp;else break;}}dfs(0);cout << -1 << endl;return 0;
}

转载于:https://www.cnblogs.com/Garen-Wang/p/10349366.html

P1312 Mayan游戏 [模拟][搜索]相关推荐

  1. 洛谷P1312 Mayan游戏

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

  2. [Luogu 1312] noip11 Mayan游戏

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

  3. 【Solr】之使用结巴分词模拟搜索商品1

    一.Solr入门 1.1 对于数据库的查询的 select * from t_goods where goodsName like "%手机%" ; 问题: 1,这个查询速度快不快 ...

  4. 搜狐的财报背后:视频“吸血”,游戏与搜索“供血”,能否再成就张朝阳的理想主义?

    文丨陈选滨 来源 | 螳螂财经(ID:TanglangFin) 在张朝阳离开大众视野,搜狐沉寂的时间里,中国的互联网已是沧海桑田的变化.新秀与巨头相互攻伐的互联网江湖涌现出诸多人物与理论. 当前,快速 ...

  5. 原生js--选项卡全选反选,选项卡切换,模拟搜索框,微博发布(带时间),注册协议倒计时

    1.全选反选按钮 <!DOCTYPE html> <html> <head lang="en"><meta charset="U ...

  6. OpenEmu for mac(苹果系统原生游戏模拟软件)

    OpenEmu for mac是一款开源的苹果系统原生游戏模拟软件,openemu mac版用来浏览.增加和管理游戏,而且支持游戏手柄,新版本的openemu for mac带来了全新的用户界面.截屏 ...

  7. 洛谷P1088.火星人【模拟/搜索/康托展开】

    洛谷P1088.火星人[模拟/搜索/康托展开] 题干 题目描述 输入格式 输出格式 输入输出样例 说明/提示 题意 思路一--模拟 分析 上代码 思路二--搜索 分析 上代码 思路三--变进制数与康托 ...

  8. C语言实现小游戏——模拟微信小游戏《最强飞刀手》

    C语言实现小游戏--模拟微信小游戏<最强飞刀手> 曾经玩过的微信小游戏,想着用C语言实现,只可惜,下图是我的上限. 这个下游戏界面简陋,把旋转的西瓜做成了平的接盘:实现的功能有:接盘的移动 ...

  9. 如何利用游戏模拟真实世界?游戏和游戏引擎的可能性|无学科专栏

    建筑师与世界和平游戏 设计师兼建筑师 Buckminster Fuller 在很早之前就看到了游戏.以及目标和奖励机制的重要性.他尝试了不同的游戏机制,最终设计了一个截然不同的战争游戏. 富勒(Ful ...

最新文章

  1. volatile超详细讲解
  2. 43行代码AC_HDU-2604 Queuing(矩阵快速幂,附详细的知识讲解、模板例题)
  3. 如何手动实现C语言中的字符串操作
  4. 圣诞节必备装饰场景PSD设计素材,不仅高清高质量
  5. UI设计灵感|迷人的概念加载动画设计
  6. 运营前线1:一线运营专家的运营方法、技巧与实践03 与用户沟通,请避免这6个“坑”!...
  7. 国基北盛—云计算容器云pass(2.4)平台搭建
  8. java文件名特殊字符_文件名不能包含哪些特殊字符
  9. LSTM+CNN模型厄尔尼诺事件预测
  10. linux tcp 异常断开连接,TCP 异常断开
  11. 小红书数据平台:2022年5月彩妆行业数据洞察报告
  12. linux网桥实现代码走读
  13. 5G网络优化.PPT
  14. 第一次安装mysql怎么样启动_CentOS第一次安装MySQL的完整步骤
  15. 深度好文之Servlet技术详解(九)
  16. Linux——DHCP篇
  17. COPU名誉主席陆首群在第十七届开源中国开源世界高峰论坛上的致辞
  18. 快速入门FTP服务器:手把手教你搭建
  19. 安装红帽子linux8的ipv4,rhel8上安装配置IDM服务(IPA-server)
  20. 基于ssm框架的毕业设计管理系统毕业设计源码211633

热门文章

  1. 多线程之线程池-各个参数的含义- 阿里,美团,京东面试题目
  2. 《科学+ 预见人工智能》——物理学家的管理方式
  3. 转 已知两点坐标和半径求圆心坐标程序C++
  4. Ehcache 整合Spring 使用页面、对象缓存
  5. 三星第二财季净利69亿美元 同比增50%
  6. Mac升级自带ruby方法
  7. All About Lily Chou-Chou
  8. JAVA工程师必学技能,进阶涨薪的推进器!这份实战教程请收下
  9. Laravel大型项目系列教程(七)之7 扩展包和Artisan开发
  10. 国防科技大学计算机学院少将,国防科技大学新任副校长兼教育长晋升少将,前任是计算机权威专家...