1501: [NOI2005]智慧珠游戏

Time Limit: 5 Sec  Memory Limit: 64 MB
Submit: 190  Solved: 122
[Submit][Status]

Description

Input

文件中包含初始的盘件描述,一共有10行,第i行有i个字符。如果第i行的第j个字符是字母”A”至”L”中的一个,则表示第i行第j列的格子上已经放了零件,零件的编号为对应的字母。如果第i行的第j个字符是”.”,则表示第i行第j列的格子上没有放零件。输入保证预放的零件已摆放在盘件中。

Output

如果能找到解,向输出文件打印10行,为放完全部12个零件后的布局。其中,第i行应包含i个字符,第i行的第j个字符表示第i行第j列的格子上放的是哪个零件。如果无解,输出单独的一个字符串‘No solution’(不要引号,请注意大小写)。所有的数据保证最多只有一组解。

Sample Input

.
..
...
....
.....
.....C
...CCC.
EEEHH...
E.HHH....
E.........

Sample Output

B
BK
BKK
BJKK
JJJDD
GJGDDC
GGGCCCI
EEEHHIIA
ELHHHIAAF
ELLLLIFFFF

HINT

 

Source

Dance Link

  多虧八中時限開的比較寬,我那個其醜無比的DLX才恰好過去了,不知道其他大神是怎麼優化成0ms的。

  作爲DLX的模板,還是貼一下。

#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<ctime>
#include<cmath>
#include<algorithm>
#include<set>
#include<map>
#include<vector>
#include<string>
#include<queue>
using namespace std;
#ifdef WIN32
#define LL "%I64d"
#else
#define LL "%lld"
#endif
#define MAXN 1100
#define MAXV MAXN*2
#define MAXE MAXV*2
#define INF 0x3f3f3f3f
#define INFL 0x3f3f3f3f3f3f3f3fLL
#define inf INF
#define MAXS 12
typedef long long qword;
inline int nextInt()
{
char ch;
int x=;
bool flag=false;
do
ch=(char)getchar(),flag=(ch=='-')?true:flag;
while(ch<''||ch>'');
do x=x*+ch-'';
while (ch=(char)getchar(),ch<='' && ch>='');
return x*(flag?-:);
}
int n,m;
const int tots[MAXS]={,,,,,,,,,,,};
const int fs_s[MAXS][][]=
{{{,},{,},{,},{inf,inf},{inf,inf}},
{{,},{,},{,},{,},{inf,inf}},
{{,},{,},{,},{,},{inf,inf}},
{{,},{,},{,},{,},{inf,inf}},
{{,},{,},{,},{,},{,}},
{{,},{,},{,},{,},{,}},
{{,},{,},{,},{,},{,}},
{{,},{,},{,},{,},{,}},
{{,},{,},{,},{,},{,}},
{{,},{,},{,},{,-},{-,}},
{{,},{,},{,},{,},{,}},
{{,},{,},{,},{,},{,}}};
int fs[][MAXS][][];
char mm[][];
struct DLX_t
{
static const int maxn=;
static const int maxm=;
static const int maxd=;
int m;
int head;
int L[maxd],R[maxd],U[maxd],D[maxd];
int id[maxd];
int topt;
int chd[maxm];
int col[maxd];
int tt[maxm];
vector<int> res;
void init(int mm,vector<int> &vec)
{
m=vec[vec.size()-];
topt=;
// memset(L,0,sizeof(L));
// memset(R,0,sizeof(R));
// memset(D,0,sizeof(D));
// memset(U,0,sizeof(U));
// memset(tt,0,sizeof(tt));
res.clear();
head=++topt;
L[head]=R[head]=head;
U[head]=D[head]=head;
int i;
for (i=;i<vec.size();i++)
{
chd[vec[i]]=++topt;
col[chd[vec[i]]]=vec[i];
id[chd[vec[i]]]=;
R[chd[vec[i]]]=head;
L[chd[vec[i]]]=L[head];
R[L[chd[vec[i]]]]=chd[vec[i]];
L[R[chd[vec[i]]]]=chd[vec[i]];
U[chd[vec[i]]]=D[chd[vec[i]]]=chd[vec[i]];
}
}
void print()
{
char mp[][];
int i,j,k1,k2;
int x,y,z,d;
for (i=;i<;i++)
{
for (j=;j<;j++)
{
mp[i][j]='.';
}
}
bool flag=false;
for (i=;i<res.size();i++)
{
if (res[i]==-)
{
flag=true;
continue;
}
d=res[i]/;
x=res[i]%/;
y=res[i]%/;
z=res[i]%;
for (j=;j<tots[z];j++)
{
mp[x+fs[d][z][j][]][y+fs[d][z][j][]]=z+'A';
}
}
for (i=;i<;i++)
{
for (j=;j<=i;j++)
{
if (mm[i+][j+]!='.')
printf("%c",mm[i+][j+]);
else
printf("%c",mp[i][j]);
}
printf("\n");
}
printf("\n"); }
void print2()
{
int i;
for (i=;i<res.size();i++)
{
printf("%d ",res[i]);
}
printf("\n"); }
void Add_row(int name,vector<int> &vec)
{
int i;
int nowh;
int now;
// sort(vec.begin(),vec.end());
for (i=;i<vec.size();i++)
{
now=++topt;
id[now]=name;
col[now]=vec[i];
tt[vec[i]]++;
U[now]=U[chd[vec[i]]];
D[now]=chd[vec[i]];
D[U[now]]=now;
U[D[now]]=now;
}
L[U[chd[vec[]]]]=R[U[chd[vec[]]]]=U[chd[vec[]]];
nowh=U[chd[vec[]]];
for (i=;i<vec.size();i++)
{
now=U[chd[vec[i]]];
R[now]=nowh;
L[now]=L[nowh];
R[L[now]]=now;
L[R[now]]=now; }
}
void finish()
{
print();
}
void cover(int c)
{
R[L[chd[c]]]=R[chd[c]];
L[R[chd[c]]]=L[chd[c]];
int i,j;
for (i=D[chd[c]];i!=chd[c];i=D[i])
{
for (j=R[i];j!=i;j=R[j])
{
tt[col[j]]--;
U[D[j]]=U[j];
D[U[j]]=D[j];
}
}
}
void resume(int c)
{
int i,j;
R[L[chd[c]]]=chd[c];
L[R[chd[c]]]=chd[c];
for (i=D[chd[c]];i!=chd[c];i=D[i])
{
for (j=R[i];j!=i;j=R[j])
{
tt[col[j]]++;
U[D[j]]=j;
D[U[j]]=j;
}
} }
bool dfs()
{
if (head==L[head])
{
finish();
return true;
}
int i,j;
int bc,bst=INF;
for (i=R[head];i!=head;i=R[i])
{
if (D[i]==i)return false;
if (tt[col[i]]<bst)
{
bst=tt[col[i]];
bc=col[i];
}
}
cover(bc);
for (i=D[chd[bc]]; i!=chd[bc] ;i=D[i])
{
res.push_back(id[i]);
for (j=R[i];j!=i;j=R[j])
cover(col[j]);
if (dfs())return true;
res.pop_back();
for (j=R[i];j!=i;j=R[j])
resume(col[j]);
}
resume(bc);
return false;
}
}DLX;
void init()
{
int i,j,k,kk;
for (i=;i<MAXS;i++)
for (j=;j<;j++)
for (k=;k<;k++)
fs[][i][j][k]=fs_s[i][j][k];
for (kk=;kk<;kk++)
{
for (i=;i<MAXS;i++)
{
for (j=;j<tots[i];j++)
{
fs[kk][i][j][]=fs[kk-][i][j][];
fs[kk][i][j][]=-fs[kk-][i][j][];
}
}
}
for (kk=;kk<;kk++)
{
for (i=;i<MAXS;i++)
{
for (j=;j<tots[i];j++)
{
fs[kk][i][j][]=-fs[kk-][i][j][];
fs[kk][i][j][]=fs[kk-][i][j][];
}
}
}
/* char mp[8][8];
for (i=0;i<MAXS;i++)
{
for (kk=0;kk<1;kk++)
{
memset(mp,0,sizeof(mp));
for (j=0;j<tots[i];j++)
{
mp[fs[kk][i][j][0]+4][fs[kk][i][j][1]+4]=true;
}
for (j=0;j<8;j++)
{
for (k=0;k<8;k++)
{
printf("%c",mp[j][k]?'.':'#');
}
printf("\n");
}
printf("\n"); }
}*/
}
bool used[];
bool state[];
vector<int> upos,tvec,pcol;
int main()
{
freopen("input.txt","r",stdin);
//freopen("output.txt","w",stdout);
int i,j,k,kk;
int x,y,z;
/*
DLX.init(5);
tvec.clear();
tvec.push_back(0);
tvec.push_back(2);
tvec.push_back(3);
DLX.Add_row(1,tvec);
tvec.clear();
tvec.push_back(2);
tvec.push_back(3);
tvec.push_back(4);
DLX.Add_row(1,tvec);
tvec.clear();
tvec.push_back(1);
tvec.push_back(3);
DLX.Add_row(1,tvec);
tvec.clear();
tvec.push_back(1);
tvec.push_back(4);
DLX.Add_row(1,tvec);
cout<<DLX.dfs()<<endl;
return 0;*/
init();
char ch;
for (i=;i<=;i++)
{
for (j=;j<=i;j++)
{
scanf("%c",&ch);
// pcol.push_back((i-1)*10+j-1);
mm[i][j]=ch;
if (ch!='.')
{
used[ch-'A']=true;
state[ch-'A'+]=true;
state[(i-)*+j-]=true;
}
}
scanf("\n");
}
for (i=;i<=;i++)
{
for (j=i+;j<=;j++)
{
state[(i-)*+j-]=true;
}
}
vector<int>::iterator it1;
for (i=;i<;i++)
{
if (!state[i])upos.push_back(i);
}
//for (i=0;i<upos.size();i++)
// cout<<upos[i]<<" ";
//cout<<endl;
DLX.init(,upos);
bool flag,flag2;
int nowid;
for (i=;i<;i++)
{
if (used[i])continue;
for (kk=;kk<;kk++)
{
flag2=false;
for (k=;k<kk;k++)
{
flag=true;
for (j=;j<tots[i];j++)
{
if (fs[kk][i][j][]!=fs[k][i][j][]
||fs[kk][i][j][]!=fs[k][i][j][])
{
flag=false;
break;
}
}
if (flag)
{
flag2=true;
break;
}
}
if (flag2)
continue;
for (x=;x<=;x++)
{
for (y=;y<=x;y++)
{
flag=true;
for (j=;j<tots[i];j++)
{
if (x+fs[kk][i][j][]< || x+fs[kk][i][j][]>
|| y+fs[kk][i][j][]< || y+fs[kk][i][j][]>
|| y+fs[kk][i][j][]>x+fs[kk][i][j][]
|| mm[x+fs[kk][i][j][]][y+fs[kk][i][j][]]!='.')
{
flag=false;
break;
}
}
if (!flag)continue;
//[dir][posx][posy][shape]
//1200 120 12 1
nowid=kk*+(x-)*+(y-)*+i;
tvec.clear();
tvec.push_back(+i);
for (j=;j<tots[i];j++)
{
//[pos][shape(+1)]
//100 +12
tvec.push_back((x+fs[kk][i][j][]-)*+y+fs[kk][i][j][]-);
}
DLX.Add_row(nowid,tvec);
}
}
}
}
if (!DLX.dfs())
printf("No solution\n");
return ;
}

bzoj 1501: [NOI2005]智慧珠游戏 Dancing Link的更多相关文章

  1. 【搜索好题】bzoj1501 [NOI2005]智慧珠游戏

    bzoj1501 [NOI2005]智慧珠游戏 搜索苟逼题系列. 暴力枚举每一种情况(包括旋转翻转全都考虑在内)然后码出代码. (正解似乎不是这样子的) 那年好像还有平衡树苟逼题维护数列233333心 ...

  2. 洛谷 P4205 [NOI2005]智慧珠游戏 DFS

    目录 题面 题目链接 题目描述 输入输出格式 输入格式 输出格式 输入输出样例 输入样例 输出样例 说明 思路 AC代码 总结 题面 题目链接 P4205 [NOI2005]智慧珠游戏 题目描述 智慧 ...

  3. [BZOJ1501][NOI2005] 智慧珠游戏

    Input 文件中包含初始的盘件描述,一共有10行,第i行有i个字符.如果第i行的第j个字符是字母”A”至”L”中的一个,则表示第i行第j列的格子上已经放了零件,零件的编号为对应的字母.如果第i行的第 ...

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

    国内少有的可以练习神仙算法--DLX的好题怎么可以被爆搜埋没呢? 看到这题没有DLX的题解所以写一篇,不过貌似我实现的太弱(构图太慢)所以速度上不是很快. 下面开始讲题,但请保证你要先学会DLX.(d ...

  5. 【BZOJ1501】【NOI2005】智慧珠游戏(搜索)

    [BZOJ1501][NOI2005]智慧珠游戏(搜索) 题面 我要一改我懒惰的作风 这道题目必须放题面 Description Input 文件中包含初始的盘件描述,一共有10行,第i行有i个字符. ...

  6. BZOJ 1501 智慧珠游戏

    Description Input 文件中包含初始的盘件描述,一共有10行,第i行有i个字符.如果第i行的第j个字符是字母”A”至”L”中的一个,则表示第i行第j列的格子上已经放了零件,零件的编号为对 ...

  7. bzoj 2706: [SDOI2012]棋盘覆盖 Dancing Link

    2706: [SDOI2012]棋盘覆盖 Time Limit: 10 Sec  Memory Limit: 256 MBSubmit: 255  Solved: 77[Submit][Status] ...

  8. bzoj 5393 [HAOI2018] 反色游戏

    bzoj 5393 [HAOI2018] 反色游戏 Link Solution 最简单的性质:如果一个连通块黑点个数是奇数个,那么就是零(每次只能改变 \(0/2\) 个黑点) 所以我们只考虑偶数个黑 ...

  9. Dancing Link 详解(转载)

    Dancing Link详解: http://www.cnblogs.com/grenet/p/3145800.html Dancing Link求解数独: http://www.cnblogs.co ...

随机推荐

  1. 全文索引(三)lucene 分词 Analyzer

    分词: 将reader通过阅读对象Analyzer字处理,得到TokenStream处理流程被称为分割. 该解释可能是太晦涩.查看示例,这个东西是什么感性的认识. 样品:一段文本"this ...

  2. oracle15 pl/sql 分页

    PL/SQL分页 编写分页过程 无返回值的存储过程 古人云:欲速则不达,为了让大家伙比较容易接受分页过程编写,我还是从简单到复杂,循序渐进的给大家讲解.首先是掌握最简单的存储过程,无返回值的存储过程: ...

  3. oracle8

    数据库管理 -- 管理表空间和数据文件 表空间是数据库的逻辑组成部分.从物理上讲,数据库数据存放在数据文件中:从逻辑上讲,数据库则是存放在表空间中,数据管理是以表空间管理的,表空间由一个或多个数据文件 ...

  4. CCEditBox用法

    1.以下是CCEditBox的相关函数和类型说明: /* 编辑框的一些函数 setText("字符串"); //设置文本 setFontColor(color); //设置文本颜色 ...

  5. iOS开发-javaScript交互

    前言 当前混合开发模式迎来了前所未有的发展,跨平台开发.热更新等优点决定了这种模式的重要地位.虽然前端界面在交互.动效等多方面距离原生应用还有差距,但毫无疑问混合开发只会被越来越多的公司接受.在iOS ...

  6. HTML+CSS基础学习笔记(7)

    CSS布局模型 在网页中,元素有三种布局模型: 1.流动模型(Flow) 2.浮动模型(Float) 3.层模型(Layer) 一.流动模型 流动(Flow)是默认的网页布局模型,网页在默认状态下的H ...

  7. DEDE自带的采集功能,标题太短的解决方法

    DEDE自带的采集功能,标题太短获取不全的解决方法搜索了好多之后,终于还是在dede的官方论坛找到了答案.增加采集标题长度:255  目的:原标题长度太小,影响文件采集⑴修改系统参数设置(文档标题最大 ...

  8. ASP.NET MVC学习系列 WebAPI初探

    转自http://www.cnblogs.com/babycool/p/3922738.html 一.无参数Get请求 一般的get请求我们可以使用jquery提供的$.get() 或者$.ajax( ...

  9. 使用正则表达式统计vs项目代码总行数[转]

    怎么统计VS2008中工程的总共代码行数?怎么统计VS2008中工程的总共代码行数?在一个大工程中有很多的源文件和头文件,我如何快速统计总行数? ------解决方案----------------- ...

  10. iOS RegexKitLite的使用以及常用的正则表达式

    1.去RegexKitLite下载类库,解压出来会有一个例子包及2个文件,其实用到的就这2个文件,添加到工程中. 2.工程中添加libicucore.dylib frameworks. 3.现在所有的 ...