zoukankan      html  css  js  c++  java
  • 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;
    }
  • 相关阅读:
    Springmvc构造RESTful详细讲解
    Http和Socket连接区别
    整合struts2+hibernate详细配置步骤及注意事项
    spring,hibernate,struts的面试笔试题
    泛型中? super T和? extends T的区别
    Java中有关Null的9件事
    Eclipse中的快捷键总结
    Hibernate之Query接口的uniqueResult()方法
    Hibernate插入、查询、删除操作 HQL
    JQuery中$.ajax()方法参数详解 转载
  • 原文地址:https://www.cnblogs.com/zjdx1998/p/4009695.html
Copyright © 2011-2022 走看看