题意:消消乐,要你找出在恰好n步消掉所有方块的方案

题解:

2011年的Day1T3,很早以前就想写了,但是一看到题面那么诡异,蛋蛋就莫名的疼......

其实只写了一个小时就写完了,但这毕竟是道神题,调了差不多一个晚上,而且必须要加一个剪枝才能过

直接暴搜,维护一下块的位置即可

剪枝:若是两个方块交换,则g[i][j]右移和g[i+1][j]左移是一回事,所以只要右移就可以了(加了之后跑的飞快)

用dev c++调的这个题真tm爽......

中秋月圆之夜,调这道蛋疼的题......,联赛不远了,愿oi生涯圆满

#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<algorithm>
#include<cmath>
#define ll long long
#define RG register
using namespace std;int n,inf=1<<30,g[10][10];
bool bj[10][10];struct Node {int x,y,d;
} mov[10],ans[10];inline void change(int &a, int &b) {a^=b,b^=a,a^=b;
}inline int gi() {int x=0,o=1;char ch=getchar();while(ch!='-' && (ch<'0' || ch>'9')) ch=getchar();if(ch=='-') o=-1,ch=getchar();while(ch>='0' && ch<='9') x=x*10+ch-'0',ch=getchar();return o*x;
}inline void clean() {bool flg;do {RG int i,j;flg=0;memset(bj,0,sizeof(bj));for(i=1; i<=5; i++) {//找竖的for(j=1; j<=7; j++) {if(g[i][j]) {RG int k=j,cnt=1;while(g[i][k+1]==g[i][k] && k<=6) cnt++,k++;if(cnt>=3) {flg=1;for(int l=j; l<=k; l++) bj[i][l]=1;}j=k;} else break;}}for(j=1; j<=7; j++)for(i=1; i<=5; i++) {if(g[i][j]) {RG int k=i,cnt=1;while(g[k+1][j]==g[k][j] && k<=4) cnt++,k++;if(cnt>=3) {flg=1;for(int l=i; l<=k; l++) bj[l][j]=1;}i=k;}}for(i=1; i<=5; i++)for(j=1; j<=7; j++)if(bj[i][j]) g[i][j]=0;for(i=1; i<=5; i++)for(j=1; j<=7; j++) {if(g[i][j]) {RG int k=j;while(!g[i][k-1] && k>=2) change(g[i][k],g[i][k-1]),k--;}}} while(flg);
}inline bool check() {for(RG int i=1; i<=5; i++)for(RG int j=1; j<=7; j++)if(g[i][j]) return false;return true;
}inline void dfs(int dep) {if(dep==n+1) {if(!check()) return;for(RG int i=1; i<=n; i++) {printf("%d %d %d\n", mov[i].x-1,mov[i].y-1,mov[i].d);}exit(0);}int tmp[10][10];memcpy(tmp,g,sizeof(g));for(RG int i=1; i<=5; i++)for(RG int j=1; j<=7; j++) {if(!g[i][j]) break;if(i+1<=5) {//右移if(i+1==mov[dep-1].x && j==mov[dep-1].y && mov[dep-1].d==-1) goto tp;if(i==mov[dep-1].x && j==mov[dep-1].y && mov[dep-1].d==1) goto tp; if(g[i+1][j]) {mov[dep].x=i,mov[dep].y=j,mov[dep].d=1;change(g[i][j],g[i+1][j]);clean();dfs(dep+1);memcpy(g,tmp,sizeof(tmp));} else {mov[dep].x=i,mov[dep].y=j,mov[dep].d=1;change(g[i][j],g[i+1][j]);int k=j;while(!g[i+1][k-1] && k>=2) change(g[i+1][k],g[i+1][k-1]),k--;for(int l=j+1; l<=7; l++) g[i][l-1]=g[i][l];clean();dfs(dep+1);memcpy(g,tmp,sizeof(tmp));}}tp:if(i-1>=1) {//左移if(i-1==mov[dep-1].x && j==mov[dep-1].y && mov[dep-1].d==1) continue;if(i==mov[dep-1].x && j==mov[dep-1].y && mov[dep-1].d==-1) continue;if(!g[i-1][j]) {mov[dep].x=i,mov[dep].y=j,mov[dep].d=-1;change(g[i][j],g[i-1][j]);int k=j;while(!g[i-1][k-1] && k>=2) change(g[i-1][k],g[i-1][k-1]),k--;for(int l=j+1; l<=7; l++) g[i][l-1]=g[i][l];clean();dfs(dep+1);memcpy(g,tmp,sizeof(tmp));}}}
}int main() {n=gi();for(RG int i=1; i<=5; i++) {int x,j=0;while(scanf("%d", &x) && x) g[i][++j]=x;}for(RG int i=1; i<=n; i++) {ans[i].x=ans[i].y=inf,ans[i].d=-inf;}dfs(1);if(ans[1].x==inf && ans[1].y==inf && ans[1].d==-inf) {puts("-1");return 0;}return 0;
}

转载于:https://www.cnblogs.com/HLXZZ/p/7625889.html

[NOIP2011] 玛雅游戏相关推荐

  1. [COGS 622] [NOIP2011] 玛雅游戏 模拟

    整个模拟的关键除了打出来就是一个剪枝:对于两个左右相邻的块你不用再走←,因为走→是等效的 #include<cstdio> #include<cstring> #include ...

  2. AcWing 185. 玛雅游戏 (dfs + 剪枝 + 模拟)

    首先,我们考虑搜索顺序,我们从第一列的第一格搜起,搜完当前列的方格的方格后,然后搜下一列,对于一个方格,我们优先右移,再搜左移.这样可以保证搜出来的字典序最小(因为先搜到的合法答案的字典序一定是最小的 ...

  3. 3D游戏建模知识分享:游戏建模都要用到哪些软件?

    [摘要] 如何学习游戏建模?3D游戏建模对于有兴趣且有时间的小伙伴,会在网上寻找大量的资料和教程,当然,科班教学更加有效和更深刻的过程会让你在其中收获到的相信不只是学识.今天讨论的话题是3D游戏建模都 ...

  4. 次世代游戏建模技巧全解之制作高模篇

    3D游戏建模知识分享:游戏建模都要用到哪些软件? 对于一些即将面临就业或低学历的小伙伴来说,如果你对这个游戏有着真挚的兴趣,你可能想知道你想先去哪个方向,是下一代还是传统造型,从而确定一个更好的学习方 ...

  5. 想进入游戏建模行业,必须要了解的基础知识

    随着国内游戏市场的蓬勃发展,行业对于游戏建模的需求在不断增加,相信很多想要进入游戏行业的小伙伴,想做3D游戏建模师,又不知道该如何去做,要成为3D游戏建模师,这些基础知识一定要了解,就带大家聊一聊关于 ...

  6. vc6.0opengl绘制人物模型_学习游戏建模?游戏人物建模软件都有哪些?

    如何学习游戏建模??对于有兴趣.有时间的小伙伴,相信自主学习的选择,也许你会在网上寻找很多素材.教程,然后开始你的探索之旅,当然,在我看来,自主学习是一个比科学教学更有效.更深刻的过程,在这个过程中, ...

  7. noip2017考前整理(未完)

    快考试了,把我以前写过的题回顾一下. Noip2007 树网的核:floyd,推出性质,暴力. Noip2008 笨小猴:模拟 Noip2008 火柴棒等式:枚举 Noip2008 传纸条:棋盘dp ...

  8. 语法入门*算法入门题单

    作者:王清楚 链接:https://ac.nowcoder.com/discuss/817596?type=101&order=0&pos=1&page=4&chann ...

  9. 【新手上路】语法入门算法入门题单

    作者:王清楚 链接:[新手上路]语法入门&算法入门题单_ACM竞赛_ACM/CSP/ICPC/CCPC/比赛经验/题解/资讯_牛客竞赛OJ_牛客网 来源:牛客网 介绍:本题单分为语法入门和算法 ...

最新文章

  1. LVS-DR模式原理
  2. oracle cpu 100%原因,oracle 12.1 cpu 100%
  3. leetcode 135. 分发糖果
  4. modify sql_在SQL Server中使用JSON_MODIFY()修改JSON数据
  5. 关于html中table表格tr,td的高度和宽度
  6. Linux操作系统知识点总结
  7. [工作笔记之一] 转正答辩 2015-08-04 15:08
  8. opencart seo优化_「opencart seo插件」wordpress SEO插件都有哪些好用的?...
  9. 大数值金额大写转换(C语言)
  10. 人工智能实践:tensorflow笔记
  11. 码流格式: Annex-B, AVCC(H.264)与HVCC(H.265), extradata详解
  12. 大数据之Javase
  13. 解析华为OSPF协议
  14. ActiveReportsJS3.0 详解 ActiveReportsJS3.X
  15. 第十六章: 请多一点
  16. 城市轨道噪声控制措施
  17. AP微积分全方位解析
  18. 电池内阻测试仪软件,fluke BT500 系列蓄电池内阻分析仪| 福禄克 | 福禄克
  19. 你知道的前端优化手段
  20. signature=2166ff43f35436f31c078e6b6e5839fe,10/16/03: Form 8-K (Transcript Slide Presentation)

热门文章

  1. link中的rel表示relation(关系),表示了当前文档与 Web 集合中其他文档的关系
  2. TUXEDO配置常见问题及解决方法
  3. 使用Picker的时候,让input输入框使用焦点,手机键盘不弹出
  4. [原创]深入理解C# 3.x的新特性(3):从Delegate、Anonymous Method到Lambda Expression
  5. PostgreSQL\GPDB 多维数据透视典型案例分享
  6. 【通过操作指针,与指针做函数參数#39;实现字串在主串中出现的次数,然后将出现的部分依照要求进行替换 】...
  7. .net的页面在大并发下偶尔出现503错误
  8. mysql 相关记录
  9. Ruby的Range类
  10. 关于jdbc连接mysql的问题bug