【NOI2005】智慧珠游戏,DLX的NOIP坎关。
这道题会做了,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坎关。相关推荐
- Luogu P4205 [NOI2005]智慧珠游戏
P4205 [NOI2005]智慧珠游戏 题意 题目描述 智慧珠游戏拼盘由一个三角形盘件和\(12\)个形态各异的零件组成.拼盘的盘 件如图\(1\)所示 对于由珠子构成的零件,可以放到盘件的任一位置 ...
- 解题报告 noi 2005 智慧珠游戏(BT 搜索)
智慧珠游戏 [问题描述] 智慧珠游戏拼盘由一个三角形盘件和12个形态各异的零件组成.拼盘的盘件如图1所示: 图1 12个零件按珠子数分3大类: 第1大类,有三个珠子,只有一种形状. 符号为A,形状为 ...
- 五连珠matlab,智慧珠游戏拼盘终于有了自己比较满意的解法
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 MasterGraph = VertexDelete[ Graph[EdgeList@ GridGraph@{10, 10}], _?(Subtract ...
- NOI 2005 智慧珠游戏 zhzyx
使劲搜索,判了一下连通块(大小<3则剪枝,3 <= 大小 <= 5 则填入对应的棋子,无法填入则剪枝),另外搜索之前判一下棋盘上半.下半部分空格的数量关系,若上面的空格较多,则把棋盘 ...
- canvas-弹珠游戏
canvas-弹珠游戏 目录 文章目录 前言 结果展示 代码展示 `pinball.html` `pinball.css` `requestNextAnimationFrame.js` `stopwa ...
- < 每日算法 - Javascript解析:经典弹珠游戏 >
每日算法 - JavaScript解析:弹珠游戏 一.任务描述: > 示例一: >示例二 二.题意解析 三.解决方案: 往期内容
- 《Arduino开发实战指南:LabVIEW卷》6.6 基于Arduino的弹珠游戏
6.6 基于Arduino的弹珠游戏 6.6.1 实现的功能 本节将使用LabVIEW及Arduino设计实现一个简单的弹珠游戏.该弹珠游戏规则为,左右移动挡板,使弹珠在矩形区域内运动而不掉落到矩形区 ...
- P7395 弹珠游戏(2021 CoE-I C)
Description 描述 Alice 对弹珠游戏已经有些厌烦了,她经常在电脑上玩这个游戏.她之所以感到厌烦是因为在这个游戏上她已经是专家级别,她总是能够和电脑打成平手. Alice 创造了一款新的 ...
- PyGame弹珠游戏双人改良版
# _*_ coding:utf-8 _*_ import pygame from pygame.locals import * from sys import exit__author__ = 'a ...
最新文章
- apk私钥_apksigner | Android 开发者 | Android Developers
- 「AI不惑境」移动端高效网络,卷积拆分和分组的精髓
- 【python】组合搜索
- 关于ubuntu对有线网卡I219-V和无线网卡RTL8723DE 802.11b/g/n的支持问题
- Linux 应用程序的源码包如何安装?
- 为什么要设置环境变量,环境变量有什么用?
- 动态卡片:富媒体内容井喷式增长下,新一代移动端动态研发的模式
- Linux环境变量详解
- 解决 iframe 后退不是主页面后退(浏览器 history)问题
- 21天Jmeter打卡Day20 响应断言,JSON断言
- Java导出Excel 复杂表头
- Unity3D内容加密保护
- PCRE demo【转】
- 神经网络计算棒怎么用,微软神经网络计算棒
- Alpha、Beta、RC、GA、LTS等软件各个版本号的含义
- 优酷弱网平台落地实践
- OpenAI 首个研究成果 生成式模型系列
- org.eclipse.wst.common.project.facet.core.xml
- 研究记录02—EKF_SLAM ——2012.4 Joan Sola
- 飞腾cpu服务器浪潮信息,推动产业进程 浪潮发国产飞腾CPU服务器
热门文章
- LiveNVR监控流媒体Onvif/RTSP常见问题-接入的通道没有云台控制按钮云台控制灰色无法操作怎么办?
- jQuery Ui Tabs插件使用问题记录
- 联想台式计算机编号怎么查,联想电脑怎么查看主机编号_联想电脑编号在哪里...
- 阿里P5-基础知识4
- 向量、矩阵 基础知识
- cocos creator2.4.4 英文卡牌游戏源码H5+安卓+IOS三端源码
- 输出1900至2000年(包含1900年和2000年)间的所有闰年
- 2022最新版校园跑腿小程序源码
- “互联网+”大学生创新创业大赛经历
- Opengrok的安装及使用