BZOJ1501 (NOI2005 智慧珠游戏)

传送门@百度

1501: [NOI2005]智慧珠游戏

Time Limit: 5 Sec  Memory Limit: 64 MB

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

恩一道非常恶心的搜索题,不过没学dancing Links所以这题的剪枝是抄别人开头的可行性剪枝。。

#include<set>
#include<map>
#include<cmath>
#include<queue>
#include<vector>
#include<cstdio>
#include<cstdlib>
#include<cstring>
using namespace std;
const int N = 150;
#define rep(i,n) for(int i=0;i<n;i++)
#define Rep(i,n) for(int i=1;i<=n;i++)
#define For(i,l,r) for(int i=l;i<=r;i++)

struct Ret{
    int tot,cnt,x[8][5],y[8][5];
    Ret():tot(0),cnt(0){memset(x,0,sizeof(x)),memset(y,0,sizeof(y));}
    Ret(int p){
        switch(p){
            case ‘A‘: cnt=4,tot=2;
                x[0][0]=1,y[0][0]=0; x[0][1]=0,y[0][1]=1;
                x[1][0]=1,y[1][0]=0; x[1][1]=1,y[1][1]=1;
                x[2][0]=0,y[2][0]=1; x[2][1]=1,y[2][1]=1;
                x[3][0]=1,y[3][0]=0; x[3][1]=1,y[3][1]=-1;
                break;
            case ‘B‘: cnt=2,tot=3;
                x[0][0]=0,y[0][0]=1; x[0][1]=0,y[0][1]=2; x[0][2]=0,y[0][2]=3;
                x[1][0]=1,y[1][0]=0; x[1][1]=2,y[1][1]=0; x[1][2]=3,y[1][2]=0;
                break;
            case ‘C‘: cnt=8,tot=3;
                x[0][0]=0,y[0][0]=1; x[0][1]=0,y[0][1]=2; x[0][2]=1,y[0][2]=0;
                x[1][0]=0,y[1][0]=1; x[1][1]=1,y[1][1]=1; x[1][2]=2,y[1][2]=1;
                x[2][0]=1,y[2][0]=-2; x[2][1]=1,y[2][1]=-1; x[2][2]=1,y[2][2]=0;
                x[3][0]=1,y[3][0]=0; x[3][1]=2,y[3][1]=0; x[3][2]=2,y[3][2]=1;
                x[4][0]=1,y[4][0]=0; x[4][1]=2,y[4][1]=0; x[4][2]=2,y[4][2]=-1;
                x[5][0]=1,y[5][0]=0; x[5][1]=1,y[5][1]=1; x[5][2]=1,y[5][2]=2;
                x[6][0]=0,y[6][0]=1; x[6][1]=1,y[6][1]=0; x[6][2]=2,y[6][2]=0;
                x[7][0]=0,y[7][0]=1; x[7][1]=0,y[7][1]=2; x[7][2]=1,y[7][2]=2;
                break;
            case ‘D‘: cnt=1,tot=3;
                x[0][0]=0,y[0][0]=1; x[0][1]=1,y[0][1]=0; x[0][2]=1,y[0][2]=1;
                break;
            case ‘E‘: cnt=4,tot=4;
                x[0][0]=0,y[0][0]=1; x[0][1]=0,y[0][1]=2; x[0][2]=1,y[0][2]=0; x[0][3]=2,y[0][3]=0;
                x[1][0]=1,y[1][0]=0; x[1][1]=2,y[1][1]=0; x[1][2]=2,y[1][2]=1; x[1][3]=2,y[1][3]=2;
                x[2][0]=0,y[2][0]=1; x[2][1]=0,y[2][1]=2; x[2][2]=1,y[2][2]=2; x[2][3]=2,y[2][3]=2;
                x[3][0]=2,y[3][0]=-2; x[3][1]=2,y[3][1]=-1; x[3][2]=2,y[3][2]=0; x[3][3]=1,y[3][3]=0;
                break;
            case ‘F‘: cnt=8,tot=4;
                x[0][0]=0,y[0][0]=1; x[0][1]=1,y[0][1]=1; x[0][2]=0,y[0][2]=2; x[0][3]=0,y[0][3]=3;
                x[1][0]=1,y[1][0]=0; x[1][1]=2,y[1][1]=0; x[1][2]=3,y[1][2]=0; x[1][3]=2,y[1][3]=1;
                x[2][0]=1,y[2][0]=-2; x[2][1]=1,y[2][1]=-1; x[2][2]=1,y[2][2]=0; x[2][3]=1,y[2][3]=1;
                x[3][0]=1,y[3][0]=-1; x[3][1]=1,y[3][1]=0; x[3][2]=2,y[3][2]=0; x[3][3]=3,y[3][3]=0;
                x[4][0]=1,y[4][0]=0; x[4][1]=1,y[4][1]=1; x[4][2]=2,y[4][2]=0; x[4][3]=3,y[4][3]=0;
                x[5][0]=1,y[5][0]=-1; x[5][1]=1,y[5][1]=0; x[5][2]=1,y[5][2]=1; x[5][3]=1,y[5][3]=2;
                x[6][0]=1,y[6][0]=0; x[6][1]=2,y[6][1]=0; x[6][2]=1,y[6][2]=-1; x[6][3]=3,y[6][3]=0;
                x[7][0]=0,y[7][0]=1; x[7][1]=0,y[7][1]=2; x[7][2]=1,y[7][2]=2; x[7][3]=0,y[7][3]=3;
                break;
            case ‘G‘: cnt=4,tot=4;
                x[0][0]=1,y[0][0]=0; x[0][1]=0,y[0][1]=1; x[0][2]=0,y[0][2]=2; x[0][3]=1,y[0][3]=2;
                x[1][0]=0,y[1][0]=1; x[1][1]=1,y[1][1]=0; x[1][2]=2,y[1][2]=0; x[1][3]=2,y[1][3]=1;
                x[2][0]=1,y[2][0]=0; x[2][1]=1,y[2][1]=1; x[2][2]=1,y[2][2]=2; x[2][3]=0,y[2][3]=2;
                x[3][0]=0,y[3][0]=1; x[3][1]=1,y[3][1]=1; x[3][2]=2,y[3][2]=1; x[3][3]=2,y[3][3]=0;
                break;
            case ‘H‘: cnt=8,tot=4;
                x[0][0]=0,y[0][0]=1; x[0][1]=1,y[0][1]=0; x[0][2]=1,y[0][2]=1; x[0][3]=0,y[0][3]=2;
                x[1][0]=1,y[1][0]=1; x[1][1]=1,y[1][1]=0; x[1][2]=2,y[1][2]=1; x[1][3]=2,y[1][3]=0;
                x[2][0]=0,y[2][0]=1; x[2][1]=1,y[2][1]=0; x[2][2]=1,y[2][2]=1; x[2][3]=1,y[2][3]=-1;
                x[3][0]=0,y[3][0]=1; x[3][1]=1,y[3][1]=0; x[3][2]=1,y[3][2]=1; x[3][3]=2,y[3][3]=1;
                x[4][0]=0,y[4][0]=1; x[4][1]=1,y[4][1]=0; x[4][2]=1,y[4][2]=1; x[4][3]=2,y[4][3]=0;
                x[5][0]=0,y[5][0]=1; x[5][1]=1,y[5][1]=0; x[5][2]=1,y[5][2]=1; x[5][3]=1,y[5][3]=2;
                x[6][0]=1,y[6][0]=-1; x[6][1]=1,y[6][1]=0; x[6][2]=2,y[6][2]=-1; x[6][3]=2,y[6][3]=0;
                x[7][0]=0,y[7][0]=1; x[7][1]=0,y[7][1]=2; x[7][2]=1,y[7][2]=1; x[7][3]=1,y[7][3]=2;
                break;
            case ‘I‘: cnt=8,tot=4;
                x[0][0]=0,y[0][0]=1; x[0][1]=0,y[0][1]=2; x[0][2]=1,y[0][2]=2; x[0][3]=1,y[0][3]=3;
                x[1][0]=1,y[1][0]=-1; x[1][1]=1,y[1][1]=0; x[1][2]=2,y[1][2]=-1; x[1][3]=3,y[1][3]=-1;
                x[2][0]=0,y[2][0]=1; x[2][1]=1,y[2][1]=1; x[2][2]=1,y[2][2]=2; x[2][3]=1,y[2][3]=3;
                x[3][0]=1,y[3][0]=0; x[3][1]=2,y[3][1]=0; x[3][2]=2,y[3][2]=-1; x[3][3]=3,y[3][3]=-1;
                x[4][0]=1,y[4][0]=0; x[4][1]=2,y[4][1]=0; x[4][2]=2,y[4][2]=1; x[4][3]=3,y[4][3]=1;
                x[5][0]=1,y[5][0]=-2; x[5][1]=1,y[5][1]=-1; x[5][2]=1,y[5][2]=0; x[5][3]=0,y[5][3]=1;
                x[6][0]=1,y[6][0]=0; x[6][1]=1,y[6][1]=1; x[6][2]=2,y[6][2]=1; x[6][3]=3,y[6][3]=1;
                x[7][0]=1,y[7][0]=0; x[7][1]=1,y[7][1]=-1; x[7][2]=0,y[7][2]=1; x[7][3]=0,y[7][3]=2;
                break;
            case ‘J‘: cnt=1,tot=4;
                x[0][0]=1,y[0][0]=-1; x[0][1]=1,y[0][1]=0; x[0][2]=1,y[0][2]=1; x[0][3]=2,y[0][3]=0;
                  break;
            case ‘K‘: cnt=4,tot=4;
                x[0][0]=1,y[0][0]=0; x[0][1]=1,y[0][1]=1; x[0][2]=2,y[0][2]=1; x[0][3]=2,y[0][3]=2;
                x[1][0]=1,y[1][0]=0; x[1][1]=1,y[1][1]=-1; x[1][2]=2,y[1][2]=-1; x[1][3]=2,y[1][3]=-2;
                x[2][0]=0,y[2][0]=1; x[2][1]=1,y[2][1]=1; x[2][2]=1,y[2][2]=2; x[2][3]=2,y[2][3]=2;
                x[3][0]=0,y[3][0]=1; x[3][1]=1,y[3][1]=0; x[3][2]=1,y[3][2]=-1; x[3][3]=2,y[3][3]=-1;
                break;
            case ‘L‘: cnt=8,tot=4;
                x[0][0]=0,y[0][0]=1; x[0][1]=0,y[0][1]=2; x[0][2]=0,y[0][2]=3; x[0][3]=1,y[0][3]=0;
                x[1][0]=0,y[1][0]=1; x[1][1]=1,y[1][1]=1; x[1][2]=2,y[1][2]=1; x[1][3]=3,y[1][3]=1;
                x[2][0]=1,y[2][0]=0; x[2][1]=1,y[2][1]=-1; x[2][2]=1,y[2][2]=-2; x[2][3]=1,y[2][3]=-3;
                x[3][0]=1,y[3][0]=0; x[3][1]=2,y[3][1]=0; x[3][2]=3,y[3][2]=0; x[3][3]=3,y[3][3]=1;
                x[4][0]=1,y[4][0]=0; x[4][1]=2,y[4][1]=0; x[4][2]=3,y[4][2]=0; x[4][3]=3,y[4][3]=-1;
                x[5][0]=1,y[5][0]=0; x[5][1]=1,y[5][1]=1; x[5][2]=1,y[5][2]=2; x[5][3]=1,y[5][3]=3;
                x[6][0]=1,y[6][0]=0; x[6][1]=2,y[6][1]=0; x[6][2]=3,y[6][2]=0; x[6][3]=0,y[6][3]=1;
                x[7][0]=0,y[7][0]=1; x[7][1]=0,y[7][1]=2; x[7][2]=0,y[7][2]=3; x[7][3]=1,y[7][3]=3;
                break;
        }
    }
}opt[N];
char a[10][10];
bool used[N];

bool Null(int x,int y,Ret &op,int l){
    rep(i,op.tot)
      if(x+op.x[l][i]<1||y+op.y[l][i]<1||a[x+op.x[l][i]][y+op.y[l][i]]!=‘.‘) return false;
    return true;
}

void put(int x,int y,Ret &op,int l,char c){
    rep(i,op.tot)
      a[x+op.x[l][i]][y+op.y[l][i]]=c;
}

bool DFS(int i,int j){
    if(i<j) return DFS(i+1,1);
    if(i>10){
        Rep(k,10) puts(a[k]+1);
        return true;
    }
    if(a[i][j]!=‘.‘) return DFS(i,j+1);
    for(int k=‘A‘;k<=‘L‘;k++)
        if(!used[k]){
            used[k]=true;a[i][j]=k;
            rep(l,opt[k].cnt)
              if(Null(i,j,opt[k],l)){
                  put(i,j,opt[k],l,k);
                  if(DFS(i,j+1)) return true;
                  put(i,j,opt[k],l,‘.‘);
              }
            used[k]=false;a[i][j]=‘.‘;
        }
    return false;
}

bool valid(){
    Rep(i,10)
        Rep(j,i)
            if(a[i][j]==‘.‘&&a[i][j+1]==‘.‘&&a[i][j-1]!=‘.‘&&a[i][j+2]!=‘.‘&&a[i-1][j]!=‘.‘&&a[i-1][j+1]!=‘.‘&&a[i+1][j]!=‘.‘&&a[i+1][j+1]!=‘.‘
             ||a[i][j]==‘.‘&&a[i+1][j]==‘.‘&&a[i-1][j]!=‘.‘&&a[i+2][j]!=‘.‘&&a[i][j-1]!=‘.‘&&a[i+1][j-1]!=‘.‘&&a[i][j+1]!=‘.‘&&a[i+1][j+1]!=‘.‘) return 0;
    return 1;
}

int main(){
    Rep(i,10) scanf("%s",a[i]+1);
    Rep(i,10)
      Rep(j,i)
        if(a[i][j]!=‘.‘) used[a[i][j]]=true;
    for(int i=‘A‘;i<=‘L‘;i++) opt[i]=Ret(i);
    if(!valid()||!DFS(1,1)) puts("No solution");
    return 0;
}
时间: 2024-10-24 00:21:44

BZOJ1501 (NOI2005 智慧珠游戏)的相关文章

[BZOJ1501][NOI2005] 智慧珠游戏

Input 文件中包含初始的盘件描述,一共有10行,第i行有i个字符.如果第i行的第j个字符是字母”A”至”L”中的一个,则表示第i行第j列的格子上已经放了零件,零件的编号为对应的字母.如果第i行的第j个字符是”.”,则表示第i行第j列的格子上没有放零件.输入保证预放的零件已摆放在盘件中. Output 如果能找到解,向输出文件打印10行,为放完全部12个零件后的布局.其中,第i行应包含i个字符,第i行的第j个字符表示第i行第j列的格子上放的是哪个零件.如果无解,输出单独的一个字符串‘No so

bzoj1501: [NOI2005]智慧珠游戏 dancing links

精确覆盖问题,用dancing links求解. 打常量表比较麻烦. #include<bits/stdc++.h> #define FOR(i,s,t)for(node* i=(s)->t;i!=(s);i=i->t) const int f[60][12]={ {0,3,0,0,0,1,1,0}, {0,3,0,0,0,1,1,1}, {0,3,0,0,1,0,1,1}, {0,3,0,1,1,0,1,1}, {1,4,0,0,0,1,0,2,0,3}, {1,4,0,0,1,

bzoj 1501: [NOI2005]智慧珠游戏 Dancing Link

1501: [NOI2005]智慧珠游戏 Time Limit: 5 Sec  Memory Limit: 64 MBSubmit: 190  Solved: 122[Submit][Status] Description Input 文件中包含初始的盘件描述,一共有10行,第i行有i个字符.如果第i行的第j个字符是字母”A”至”L”中的一个,则表示第i行第j列的格子上已经放了零件,零件的编号为对应的字母.如果第i行的第j个字符是”.”,则表示第i行第j列的格子上没有放零件.输入保证预放的零件已

BZOJ 1501 NOI2005 智慧珠游戏 Dancing-Links(DLX)

题目大意:给定一个10*10的三角形棋盘和12种零件,每种零件只能放一次,可以旋转和翻转,一些零件已经放在了上面,求一种方案,使12个零件无重叠地放在棋盘上 首先这题目一看就是DLX 但是建图真心恶心 需要枚举每一个零件的最多八个朝向的所有位置 我一开始想要全部代码处理 但是后来发现真做不了 于是我选择了打表录入12个零件的所有60种朝向,选择第一排最左面的点作为基点,依次得出每个点关于基点的相对位置,然后再图上枚举基点的位置,若所有点都在图上就加行 一共60*5*2的表 打了40分钟 键盘被敲

【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列表示位置,每个位置

BZOJ 1501 智慧珠游戏

Description Input 文件中包含初始的盘件描述,一共有10行,第i行有i个字符.如果第i行的第j个字符是字母”A”至”L”中的一个,则表示第i行第j列的格子上已经放了零件,零件的编号为对应的字母.如果第i行的第j个字符是”.”,则表示第i行第j列的格子上没有放零件.输入保证预放的零件已摆放在盘件中. Output 如果能找到解,向输出文件打印10行,为放完全部12个零件后的布局.其中,第i行应包含i个字符,第i行的第j个字符表示第i行第j列的格子上放的是哪个零件.如果无解,输出单独

ios版弹珠游戏源码

这个是我们比较喜欢玩的一直小游戏的,ios版弹珠游戏源码,该游戏源码来着IOS教程网其他网友提供上传的,大家可以了解一下吧. nore_js_op>   <ignore_js_op> <ignore_js_op> 详细说明:http://ios.662p.com/thread-1353-1-1.html

使用Marbles弹珠游戏模拟区块链资产转移

本实践基于华为云区块链服务,以基于区块链的弹珠资产转移Marbles Demo部署为例进行演示,旨在帮助您了解链代码的基础知识以及如何使用Fabric网络开发应用程序,帮助您快速上手使用. 关于Demo这是一个简单的资产转移演示,多个用户之间可以创建并相互转移弹珠资产,同时您还能看到详细的交易信息及区块链信息.界面如下: ×××如果您需要查看Demo应用的源码,请点击下载源码进行下载查看,希望对您的应用开发有所帮助. 准备工作华为云区块链服务是基于容器所构建的集群进行部署的,同时为使外网能够正常

搜索专讲

搜索专讲 Tags:搜索 https://www.zybuluo.com/xzyxzy/note/1058215 前言 做一个专题肯定是要花点时间的 但是哇,搜索怎么这么多内容?!WTF?! 好吧慢慢刷,待四五月份左右出pdf或ppt的讲义吧 先把题目放上,大家愿意的和我一起做吧 题目 李老师给了一个包 广搜 [x] ?POJ1426-Find The Multiple https://vjudge.net/problem/POJ-1426 [x] POJ2251-Dungeon Master