这道题会做了,NOIP就出什么DLX都不怕了,注意:是NOI“P”。

题意:有12个块,可以任意翻转、旋转,即每个块最多有8种表现形式。现在要求你把它们填进图中。

注:每个块只能用一次。

DLX建图:列55+12,行若干。

当然,我是会给你算好的数据的。

#define N 3000/*每个块“8”种形状就会有2730行*/
#define M 70/*55+12这么多列*/
#define NN 16000/*空图最多15084个点*/

前55列表示位置,每个位置上最多只有一个节点,后12列表示每个块的若干种摆放方案中只能选一个。

建图:每行表示一种摆放方案,记录fid表示其块键值,即记录“A~L”,然后枚举它放在哪里,能放进去就对前55列中某些列加节点,然后再把这行与后12列中的对应列加个节点。

因为方块不变,所以我们可以先打表记录方块的形状。

因为基本不会TLE,所以我们没必要打12*8个方块,我们只需要打12个方块的表就好了,表的打法如下。

const int lenx[20]={3,4,4,4,5,5,5,5,5,5,5,5};
const int table[15][10][5]=
{/*A*/{{0,0},{1,0},{0,1}},/*B*/{{0,0},{0,1},{0,2},{0,3}},/*C*/{{0,0},{1,0},{0,1},{0,2}},/*D*/{{0,0},{1,0},{0,1},{1,1}},/*E*/{{0,0},{1,0},{2,0},{2,1},{2,2}},/*F*/{{0,0},{0,1},{1,1},{0,2},{0,3}},/*G*/{{0,0},{1,0},{0,1},{0,2},{1,2}},/*H*/{{0,0},{1,0},{0,1},{1,1},{0,2}},/*I*/{{0,0},{0,1},{0,2},{1,2},{1,3}},/*J*/{{0,0},{-1,1},{0,1},{1,1},{0,2}},/*K*/{{0,0},{1,0},{1,1},{2,1},{2,2}},/*L*/{{0,0},{1,0},{0,1},{0,2},{0,3}}
};

每个table[i][j]表示第i个图形的第j个格子与第0个格子的横纵坐标差值(不是加绝对值的那种差值),

然后用的时候进行枚举

Ⅰ.每个点的{a,b}中a应该加到x还是y上,

Ⅱ.每个点的x值需要加还是减,

Ⅲ.每个点的y值需要加还是减。

实现:

     int nx[2],mul[2]={-1,1};for(shape=0;shape<12;shape++){elist++;for(tx=0;tx<2;tx++)for(xm=0;xm<2;xm++)for(ym=0;ym<2;ym++)/*样子枚举完毕*/for(ti[0]=1;ti[0]<=10;ti[0]++)for(ti[1]=1;ti[1]<=ti[0];ti[1]++)

就是这样简单。

好了,贴完整代码。

#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#define N 3000/*每个块“8”种形状就会有2730行*/
#define M 70/*55+12这么多列*/
#define NN 16000/*空图最多15084个点*/
#define inf 0x3f3f3f3f
using namespace std;
const int lenx[20]={3,4,4,4,5,5,5,5,5,5,5,5};
const int table[15][10][5]=
{/*A*/{{0,0},{1,0},{0,1}},/*B*/{{0,0},{0,1},{0,2},{0,3}},/*C*/{{0,0},{1,0},{0,1},{0,2}},/*D*/{{0,0},{1,0},{0,1},{1,1}},/*E*/{{0,0},{1,0},{2,0},{2,1},{2,2}},/*F*/{{0,0},{0,1},{1,1},{0,2},{0,3}},/*G*/{{0,0},{1,0},{0,1},{0,2},{1,2}},/*H*/{{0,0},{1,0},{0,1},{1,1},{0,2}},/*I*/{{0,0},{0,1},{0,2},{1,2},{1,3}},/*J*/{{0,0},{-1,1},{0,1},{1,1},{0,2}},/*K*/{{0,0},{1,0},{1,1},{2,1},{2,2}},/*L*/{{0,0},{1,0},{0,1},{0,2},{0,3}}
};
const int crsx[60]=
{0 ,1 ,2 ,2 ,3 ,3 ,3 ,4 ,4 ,4 ,4 ,5 ,5 ,5 ,5 ,5 ,6 ,6 ,6 ,6 ,6 ,6 ,7 ,7 ,7 ,7 ,7 ,7 ,7 ,8 ,8 ,8 ,8 ,8 ,8 ,8 ,8 ,9 ,9 ,9 ,9 ,9 ,9 ,9 ,9 ,9 ,10,10,10,10,10,10,10,10,10,10
};
const int crsy[60]=
{0 ,1 ,1 ,2 ,1 ,2 ,3 ,1 ,2 ,3 ,4 ,1 ,2 ,3 ,4 ,5 ,1 ,2 ,3 ,4 ,5 ,6 ,1 ,2 ,3 ,4 ,5 ,6 ,7 ,1 ,2 ,3 ,4 ,5 ,6 ,7 ,8 ,1 ,2 ,3 ,4 ,5 ,6 ,7 ,8 ,9 ,1 ,2 ,3 ,4 ,5 ,6 ,7 ,8 ,9 ,10
};
char TS[30][30];
struct DLX
{int elist,eline;int stid[30][30];int eid[M];int fid[N];bool visit[30];int U[NN],D[NN],L[NN],R[NN],C[NN],V[NN];int H[N],T[M],cnt;int ans[30][30];inline void newnode(int x,int y){C[++cnt]=y;V[cnt]=x;T[y]++;if(!H[x])H[x]=L[cnt]=R[cnt]=cnt;else L[cnt]=H[x],R[cnt]=R[H[x]];R[H[x]]=L[R[H[x]]]=cnt,H[x]=cnt;U[cnt]=U[y],D[cnt]=y;U[y]=D[U[y]]=cnt;}inline void remove(int x){for(int i=D[x];i!=x;i=D[i]){for(int j=R[i];j!=i;j=R[j]){U[D[j]]=U[j];D[U[j]]=D[j];T[C[j]]--;}}L[R[x]]=L[x];R[L[x]]=R[x];}inline void resume(int x){for(int i=U[x];i!=x;i=U[i]){for(int j=L[i];j!=i;j=L[j]){U[D[j]]=j;D[U[j]]=j;T[C[j]]++;}}L[R[x]]=x;R[L[x]]=x;}inline void build(){int ti[2],i,j,k;for(i=1;i<=10;i++)for(j=1;j<=i;j++)if(TS[i][j]!='.')visit[TS[i][j]-'A']=1;for(i=1;i<=10;i++)for(j=1;j<=i;j++)stid[i][j]=++elist;cnt=elist+12;for(i=1;i<=cnt;i++){U[i]=D[i]=i;L[i]=L[0],R[i]=0;L[0]=R[L[0]]=i;}int tx,xm,ym,shape;int nx[2],mul[2]={-1,1};for(shape=0;shape<12;shape++){elist++;for(tx=0;tx<2;tx++)for(xm=0;xm<2;xm++)for(ym=0;ym<2;ym++)/*样子枚举完毕*/for(ti[0]=1;ti[0]<=10;ti[0]++)for(ti[1]=1;ti[1]<=ti[0];ti[1]++){for(k=0;k<lenx[shape];k++){nx[ tx ]=ti[ tx ]+mul[xm]*table[shape][k][0];nx[tx^1]=ti[tx^1]+mul[ym]*table[shape][k][1];if(visit[shape]){if(TS[nx[0]][nx[1]]!='A'+shape)break;}else if(TS[nx[0]][nx[1]]!='.')break;}if(k==lenx[shape]){fid[++eline]=shape;for(k=0;k<lenx[shape];k++){nx[ tx ]=ti[ tx ]+mul[xm]*table[shape][k][0];nx[tx^1]=ti[tx^1]+mul[ym]*table[shape][k][1];newnode(eline,stid[nx[0]][nx[1]]);}newnode(eline,elist);}}                 }}inline bool dfs(){if(!R[0])return true;int S=R[0],W=T[S],i,j;for(i=R[S];i;i=R[i])if(T[i]<W){W=T[i];S=i;}remove(S);for(i=D[S];i!=S;i=D[i]){if(C[i]<=55)ans[crsx[C[i]]][crsy[C[i]]]=fid[V[i]];for(j=R[i];j!=i;j=R[j]){remove(C[j]);if(C[j]<=55)ans[crsx[C[j]]][crsy[C[j]]]=fid[V[j]];}if(dfs())return true;for(j=L[i];j!=i;j=L[j])resume(C[j]);}resume(S);return false;}inline void ret(){for(int i=1;i<=10;i++){for(int j=1;j<=i;j++)printf("%c",ans[i][j]+'A');puts("");}}inline void work(){build();if(dfs())ret();else puts("No solution");}
}dlx;
int main()
{
//  freopen("test.in","r",stdin);
//  freopen("my.out","w",stdout);for(int i=1;i<=10;i++)scanf("%s",TS[i]+1);dlx.work();return 0;
}

【NOI2005】智慧珠游戏,DLX的NOIP坎关。相关推荐

  1. Luogu P4205 [NOI2005]智慧珠游戏

    P4205 [NOI2005]智慧珠游戏 题意 题目描述 智慧珠游戏拼盘由一个三角形盘件和\(12\)个形态各异的零件组成.拼盘的盘 件如图\(1\)所示 对于由珠子构成的零件,可以放到盘件的任一位置 ...

  2. 解题报告 noi 2005 智慧珠游戏(BT 搜索)

    智慧珠游戏 [问题描述] 智慧珠游戏拼盘由一个三角形盘件和12个形态各异的零件组成.拼盘的盘件如图1所示: 图1 12个零件按珠子数分3大类: 第1大类,有三个珠子,只有一种形状. 符号为A,形状为 ...

  3. 五连珠matlab,智慧珠游戏拼盘终于有了自己比较满意的解法

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 MasterGraph = VertexDelete[ Graph[EdgeList@ GridGraph@{10, 10}], _?(Subtract ...

  4. NOI 2005 智慧珠游戏 zhzyx

    使劲搜索,判了一下连通块(大小<3则剪枝,3 <= 大小 <= 5 则填入对应的棋子,无法填入则剪枝),另外搜索之前判一下棋盘上半.下半部分空格的数量关系,若上面的空格较多,则把棋盘 ...

  5. canvas-弹珠游戏

    canvas-弹珠游戏 目录 文章目录 前言 结果展示 代码展示 `pinball.html` `pinball.css` `requestNextAnimationFrame.js` `stopwa ...

  6. < 每日算法 - Javascript解析:经典弹珠游戏 >

    每日算法 - JavaScript解析:弹珠游戏 一.任务描述: > 示例一: >示例二 二.题意解析 三.解决方案: 往期内容

  7. 《Arduino开发实战指南:LabVIEW卷》6.6 基于Arduino的弹珠游戏

    6.6 基于Arduino的弹珠游戏 6.6.1 实现的功能 本节将使用LabVIEW及Arduino设计实现一个简单的弹珠游戏.该弹珠游戏规则为,左右移动挡板,使弹珠在矩形区域内运动而不掉落到矩形区 ...

  8. P7395 弹珠游戏(2021 CoE-I C)

    Description 描述 Alice 对弹珠游戏已经有些厌烦了,她经常在电脑上玩这个游戏.她之所以感到厌烦是因为在这个游戏上她已经是专家级别,她总是能够和电脑打成平手. Alice 创造了一款新的 ...

  9. PyGame弹珠游戏双人改良版

    # _*_ coding:utf-8 _*_ import pygame from pygame.locals import * from sys import exit__author__ = 'a ...

最新文章

  1. apk私钥_apksigner  |  Android 开发者  |  Android Developers
  2. 「AI不惑境」移动端高效网络,卷积拆分和分组的精髓
  3. 【python】组合搜索
  4. 关于ubuntu对有线网卡I219-V和无线网卡RTL8723DE 802.11b/g/n的支持问题
  5. Linux 应用程序的源码包如何安装?
  6. 为什么要设置环境变量,环境变量有什么用?
  7. 动态卡片:富媒体内容井喷式增长下,新一代移动端动态研发的模式
  8. Linux环境变量详解
  9. 解决 iframe 后退不是主页面后退(浏览器 history)问题
  10. 21天Jmeter打卡Day20 响应断言,JSON断言
  11. Java导出Excel 复杂表头
  12. Unity3D内容加密保护
  13. PCRE demo【转】
  14. 神经网络计算棒怎么用,微软神经网络计算棒
  15. Alpha、Beta、RC、GA、LTS等软件各个版本号的含义
  16. 优酷弱网平台落地实践
  17. OpenAI 首个研究成果 生成式模型系列
  18. org.eclipse.wst.common.project.facet.core.xml
  19. 研究记录02—EKF_SLAM ——2012.4 Joan Sola
  20. 飞腾cpu服务器浪潮信息,推动产业进程 浪潮发国产飞腾CPU服务器

热门文章

  1. LiveNVR监控流媒体Onvif/RTSP常见问题-接入的通道没有云台控制按钮云台控制灰色无法操作怎么办?
  2. jQuery Ui Tabs插件使用问题记录
  3. 联想台式计算机编号怎么查,联想电脑怎么查看主机编号_联想电脑编号在哪里...
  4. 阿里P5-基础知识4
  5. 向量、矩阵 基础知识
  6. cocos creator2.4.4 英文卡牌游戏源码H5+安卓+IOS三端源码
  7. 输出1900至2000年(包含1900年和2000年)间的所有闰年
  8. 2022最新版校园跑腿小程序源码
  9. “互联网+”大学生创新创业大赛经历
  10. Opengrok的安装及使用