当前位置: 首页 > news >正文

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

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

#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<ctime>
#define r register
using namespace std;
int f[20][20][20];
int s[20][20];
bool die[20][20];
int n;
bool god;
inline void Init()
{
    scanf("%d",&n);
    for(int i=1,x;i<=5;i++)
      while(1)
      {
        scanf("%d",&x);
        if(x==0)break;
        f[0][i][++f[0][i][0]]=x;
      }
}
void arrange(int h,int x,int y,int t)
{ 
     s[h][1]=x;
     s[h][2]=y;
     s[h][3]=t; 
     memcpy(f[h],f[h-1],sizeof(f[h]));
     f[h][x][y]^=f[h][x+t][y]^=f[h][x][y]^=f[h][x+t][y];
     if(!f[h][x][y])++f[h][x+t][0],--f[h][x][0];
     if(f[h][x][y]==0&&f[h][x][y+1]!=0)
     {
       r int j=y+1;
       while(f[h][x][j]!=0)
        f[h][x][j-1]^=f[h][x][j]^=f[h][x][j-1]^=f[h][x][j],++j; 
     } 
     if(f[h][x+t][y-1]==0)
     {
       r int j=y-1;
       while(f[h][x+t][j]==0)
         f[h][x+t][j]^=f[h][x+t][j+1]^=f[h][x+t][j]^=f[h][x+t][j+1],--j;
     } 
     r int get;
     do
     {
       get=0;
       for(r int i=1;i<=5;++i)
        for(r int j=1;j<=f[h][i][0];++j)
        {
           r int k=0;
           while(f[h][i][j]==f[h][i][j+k])++k;
           if(k>=3)
           {
             for(int l=0;l<k;++l)
              die[i][j+l]=1;
           }
           j+=k-1;
        }
       for(r int i=1;i<=7;++i)
        for(r int j=1;j<=5;++j)
        {
           if(f[h][j][i]==0)continue;
           r int k=0;
           while(f[h][j][i]==f[h][j+k][i])++k;
           if(k>=3)
           {
             for(int l=0;l<k;l++)
              die[j+l][i]=1;
           }
           j+=k-1;
        }
        for(r int i=1;i<=5;++i)
          for(r int j=1;j<=f[h][i][0];++j)
           if(die[i][j])
            f[h][i][j]=0,die[i][j]=0;
        for(r int i=1;i<=5;++i)
        {
          r int k=0;
          for(r int j=1;j<=f[h][i][0];++j)
           if(f[h][i][j])f[h][i][++k]=f[h][i][j];
           else ++get;
          for(r int j=k+1;j<=f[h][i][0];++j)f[h][i][j]=0;
          f[h][i][0]=k;
        }
     }while(get);
}
void dfs(int x)
{
    if(x==n)
    {
      r int sum=0;
      for(r int i=1;i<=5;++i)sum+=f[x][i][0];
      if(sum==0)god=1;
      return;
    }
    for(r int i=1;i<=5;i++)
     for(r int j=1;j<=f[x][i][0];j++)
     {
       if(i!=5)
       {
         arrange(x+1,i,j,1);
         dfs(x+1);
         if(god)return;
       }
       if(i!=1&&f[x][i-1][j]==0)
       {
         arrange(x+1,i,j,-1);
         dfs(x+1);
         if(god)return;
       }
     }
}
inline void work()
{
    dfs(0);
    if(god)
    {
      for(int i=1;i<=n;i++)
       printf("%d %d %d\n",s[i][1]-1,s[i][2]-1,s[i][3]);
    }
    else
     printf("-1");
}
int main()
{
    Init();
    work();
    return 0;
}

 

转载于:https://www.cnblogs.com/TSHugh/p/7248191.html

相关文章:

  • Chrome浏览器扩展开发系列之二:Google Chrome浏览器扩展的调试
  • 算法分类合集(转)
  • 转每天一个linux命令(2):cd命令
  • app 2015
  • 6 线性表-栈-顺序存储
  • MySql 知识点——MQSQL必知必会读书笔记
  • 小学英语单词到动物九
  • SQL语句搜索中 union all 联合查询
  • this 基础使用方法
  • 【Java基础】12、java中方法的参数传递机制
  • OpenNebula学习第四节之磁盘镜像的制作
  • 转:Spring Boot中使用AOP统一处理Web请求日志
  • 《零基础入门学习Python》学习过程笔记【38类的继承】
  • 制作毛玻璃效果
  • 设计模式——简单工厂模式
  • JavaScript/HTML5图表开发工具JavaScript Charts v3.19.6发布【附下载】
  • Laravel核心解读--Facades
  • Netty 4.1 源代码学习:线程模型
  • Sublime text 3 3103 注册码
  • 诡异!React stopPropagation失灵
  • 海量大数据大屏分析展示一步到位:DataWorks数据服务+MaxCompute Lightning对接DataV最佳实践...
  • 聊一聊前端的监控
  • 漂亮刷新控件-iOS
  • 数据结构java版之冒泡排序及优化
  • 突破自己的技术思维
  • 我的面试准备过程--容器(更新中)
  • 一道闭包题引发的思考
  • 一加3T解锁OEM、刷入TWRP、第三方ROM以及ROOT
  • 译有关态射的一切
  • 用element的upload组件实现多图片上传和压缩
  • 原创:新手布局福音!微信小程序使用flex的一些基础样式属性(一)
  • 原生js练习题---第五课
  • Semaphore
  • 关于Android全面屏虚拟导航栏的适配总结
  • 如何用纯 CSS 创作一个菱形 loader 动画
  • 数据可视化之下发图实践
  • 专访Pony.ai 楼天城:自动驾驶已经走过了“从0到1”,“规模”是行业的分水岭| 自动驾驶这十年 ...
  • ​linux启动进程的方式
  • ​第20课 在Android Native开发中加入新的C++类
  • ​如何防止网络攻击?
  • # 执行时间 统计mysql_一文说尽 MySQL 优化原理
  • #define,static,const,三种常量的区别
  • #Linux(Source Insight安装及工程建立)
  • #周末课堂# 【Linux + JVM + Mysql高级性能优化班】(火热报名中~~~)
  • (1)Android开发优化---------UI优化
  • (2020)Java后端开发----(面试题和笔试题)
  • (23)Linux的软硬连接
  • (4) openssl rsa/pkey(查看私钥、从私钥中提取公钥、查看公钥)
  • (C语言)strcpy与strcpy详解,与模拟实现
  • (pojstep1.1.2)2654(直叙式模拟)
  • (层次遍历)104. 二叉树的最大深度
  • (二)丶RabbitMQ的六大核心
  • (附源码)php新闻发布平台 毕业设计 141646
  • (附源码)基于SpringBoot和Vue的厨到家服务平台的设计与实现 毕业设计 063133
  • (蓝桥杯每日一题)平方末尾及补充(常用的字符串函数功能)