P4205 [NOI2005] 智慧珠游戏

 

#include <bits/stdc++.h>
using namespace std;
const int maxr=55*12*8;
const int maxn=68;
const int maxnode=maxr*6;
// DLX板子
struct DLX
{
    int n,sz,S[maxn],row[maxnode],col[maxnode];
    int L[maxnode],R[maxnode],U[maxnode],D[maxnode];
    int ansd,ans[maxr];
    void init(int n)
    {
        this->n=n;
        for(int i=0;i<=n;i++)
        {
            U[i]=i; D[i]=i; L[i]=i-1; R[i]=i+1;
        }
        R[n]=0; L[0]=n;
        sz=n+1;
        memset(S,0,sizeof(S));
    }
    void addRow(int r,const vector<int> &columns)
    {
        int first=sz,c;
        for(int i=0;i<columns.size();i++)
        {
            c=columns[i];
            L[sz]=sz-1; R[sz]=sz+1; D[sz]=c; U[sz]=U[c];
            D[U[c]]=sz; U[c]=sz;
            row[sz]=r; col[sz]=c;
            S[c]++; sz++; 
        }
        R[sz-1]=first; L[first]=sz-1; 
    }
    #define FOR(i,A,s) for(int i=A[s];i!=s;i=A[i])
    void remove(int c)
    {
        L[R[c]]=L[c]; R[L[c]]=R[c];
        FOR(i,D,c) FOR(j,R,i) { U[D[j]]=U[j]; D[U[j]]=D[j]; S[col[j]]--; } 
    }
    void restore(int c)
    {
        FOR(i,U,c) FOR(j,L,i) { S[col[j]]++; U[D[j]]=j; D[U[j]]=j; }
        L[R[c]]=c; R[L[c]]=c;
    }
    bool dfs(int d)
    {
        if(R[0]==0)
        {
            ansd=d;
            return true;
        }
        int c=R[0];
        FOR(i,R,0) if(S[i]<S[c]) c=i;
        remove(c);
        FOR(i,D,c)
        {
            ans[d]=row[i];
            FOR(j,R,i) remove(col[j]);
            if(dfs(d+1)) return true;
            FOR(j,L,i) restore(col[j]);
        }
        restore(c);
        return false;
    }
    bool solve(vector<int>& v)
    {
        v.clear();
        if(!dfs(0)) return false;
        for(int i=0;i<ansd;i++) v.push_back(ans[i]);
        return true; 
    }
}solver;
char ma[maxr][10][11]; // 记录在DLX中每一行对应的形状
char ans[10][11]; // 填充答案用的
int ha[10][10]; // 每一个格子代表在DLX中的第几列
bool vis[12]; // 记录哪些零件被用过
const int lr[12]={0,0,1,0,0,1,0,1,1,0,0,1}; // 左右翻转后是否跟旋转后相同,相同是1,不相同是0
const int t[12]={4,2,4,1,4,4,4,4,4,1,4,4}; // 4代表旋转180度和原先不同,2代表旋转180度和原先相同但旋转90度不同,1代表旋转90度相同
const int x[12][6]={ // 每个零件在一个平面直角坐标里对应哪些点,这个记录x坐标,-1结束。这个千万别打错。
    {0,0,1,-1},
    {0,1,2,3,-1},
    {0,0,1,2,-1},
    {0,0,1,1,-1},
    {0,0,0,1,2,-1},
    {0,1,1,2,3,-1},
    {0,0,1,2,2,-1},
    {0,0,1,1,2,-1},
    {0,1,2,2,3,-1},
    {0,1,1,1,2,-1},
    {0,0,1,1,2,-1},
    {0,0,1,2,3,-1},
};
const int y[12][6]={ // 这个记录y坐标,-1结束
    {0,1,0,-1},
    {0,0,0,0,-1},
    {0,1,0,0,-1},
    {0,1,0,1,-1},
    {0,1,2,0,0,-1},
    {0,0,1,0,0,-1},
    {0,1,0,0,1,-1},
    {0,1,0,1,0,-1},
    {0,0,0,1,1,-1},
    {1,0,1,2,1,-1},
    {0,1,1,2,2,-1},
    {0,1,0,0,0,-1},
};
inline void clear(int id) // 清空当前的形状
{
    register int i,j;
    for(i=0;i<10;i++)
        for(j=0;j<=i;j++)
            ma[id][i][j]='.';
}
int main()
{
    register int i,j,k,l,tot,cx,cy,tx,ty;
    vector<int> vec;
    solver.init(67); // 67列
    for(i=0;i<10;i++)
        scanf("%s",ans[i]);
    for(i=0;i<12;i++) vis[i]=0;
    for(i=0;i<10;i++)
        for(j=0;j<=i;j++)
            if(ans[i][j]!='.')
                vis[ans[i][j]-'A']=1;
    for(i=0,tot=0;i<10;i++)
    {
        for(j=0;j<=i;j++)
            ha[i][j]=++tot;
        for(;j<10;j++)
            ha[i][j]=-1;
    }
    for(i=0,tot=1;i<12;i++) // 第几个零件
    {
        for(j=-1;j<=lr[i];j+=2) // x的变化量是否乘以-1或1代表是否翻转,而lr[i]=0时只取一个
            for(k=0;k<t[i];k++) // k=0表示不旋转,k=1时表示旋转90度(我不太清楚时顺时针还是逆时针,但不重要),k=2时表示旋转180度,k=3时表示旋转270度;t[i]=1时不旋转,t[i]=2时旋转不超过180度,t[i]=4时四种旋转都表示得到
                for(cx=-5;cx<=15;cx++)
                    for(cy=-5;cy<=cx+5;cy++) // 枚举零件一角
                    {
                        clear(tot);
                        for(l=0;x[i][l]>=0;l++)
                        {
                            if(k&1) // 旋转
                            {
                                tx=cx+((k&2)?x[i][l]:-x[i][l])*j;
                                ty=cy+((k&2)?y[i][l]:-y[i][l]);
                            }
                            else
                            {
                                tx=cx+((k&2)?y[i][l]:-y[i][l])*j;
                                ty=cy+((k&2)?-x[i][l]:x[i][l]);
                            }
                            if(!(0<=ty && ty<=tx && tx<10)) break;
                            if(vis[i] && ans[tx][ty]!=i+'A') break; // 已经确定的零件必须和图对应
                            if(!vis[i] && ans[tx][ty]!='.') break; // 没确定的零件要摆在空位上
                            ma[tot][tx][ty]=i+'A'; // 先记录下来
                        }
                        if(x[i][l]<0)
                        {
                            vec.clear();
                            for(l=0;x[i][l]>=0;l++)
                            {
                                if(k&1)
                                {
                                    tx=cx+((k&2)?x[i][l]:-x[i][l])*j;
                                    ty=cy+((k&2)?y[i][l]:-y[i][l]);
                                }
                                else
                                {
                                    tx=cx+((k&2)?y[i][l]:-y[i][l])*j;
                                    ty=cy+((k&2)?-x[i][l]:x[i][l]);
                                }
                                vec.push_back(ha[tx][ty]); // 填了那些就把列设为1
                            }
                            vec.push_back(i+56); // 还有每个零件对应的列
                            solver.addRow(tot++,vec);
                        }
                    }
    }
    if(!solver.solve(vec)) printf("No solution\n");
    else // 填充答案
    {
        for(i=0;i<vec.size();i++)
            for(j=0;j<10;j++)
                for(k=0;k<=j;k++)
                    if(ma[vec[i]][j][k]!='.')
                        ans[j][k]=ma[vec[i]][j][k];
        for(i=0;i<10;i++)
            printf("%s\n",ans[i]);
    }
    return 0;
}
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>

using namespace std;

int gi(){
    char x=getchar();
    while(x!='.'&&(x>'Z'||x<'A')) x=getchar();
    return x=='.'?0:(int)(x-'A'+1);
}

int a[16][16],ti;
bool in[15];

char id(int x){
    return (char)(x+'A'-1);
}

int get(){
    for(int i=1;i<=10;i++){
        for(int j=1;j<=i;j++)
             if(a[j][i]==0){
         return j*100+i;
        }
    }
}

bool ok(){
     for(int o=1;o<=12;o++)
     if(in[o]==false)
     return false;
     return true;
}

void init(){
    memset(a,-1,sizeof(a));
    memset(in,0,sizeof(in));
    for(int i=1;i<=10;i++){
        for(int j=1;j<=i;j++){
            a[j][i]=gi();
            in[a[j][i]]=true;
        }
    }
    
}

void print(){
    for(int i=1;i<=10;i++){
        for(int j=1;j<=i;j++){
            cout<<id(a[j][i]);  
        }
        cout<<endl;
    }
}

void dfs(int dep){
    
    if(dep>=3000000){
        printf("No solution");
        exit(0);
    }//卡搜索次数
    //可以玄学证明:如果有解那么深搜的最大次数不会超过3e6
    
    if(ok()) {
      print();
      exit(0);  
    }
      
    int zt=get();
    int px=zt/100;
    int py=zt%10;
    if(py==0) py=10;
    
    //A:4cases
    if(!in[1]){
        
        if(a[px+1][py]==0&&a[px][py+1]==0){
            a[px][py]=1;
            a[px+1][py]=1;
            a[px][py+1]=1;
            in[1]=true;
            dfs(dep+1);
            a[px][py]=0;
            a[px+1][py]=0;
            a[px][py+1]=0;
            in[1]=false;
        } 
        
        if(a[px][py+1]==0&&a[px+1][py+1]==0){
            a[px][py]=1;
            a[px][py+1]=1;
            a[px+1][py+1]=1;
            in[1]=true;
            dfs(dep+1);
            a[px][py]=0;
            a[px][py+1]=0;
            a[px+1][py+1]=0;
            in[1]=false;
        } 
        
        if(a[px][py+1]==0&&a[px-1][py+1]==0){
            a[px][py]=1;
            a[px][py+1]=1;
            a[px-1][py+1]=1;
            in[1]=true;
            dfs(dep+1);
            a[px][py]=0;
            a[px][py+1]=0;
            a[px-1][py+1]=0;
            in[1]=false;
        } 
        
        if(a[px+1][py]==0&&a[px+1][py+1]==0){
            a[px][py]=1;
            a[px+1][py]=1;
            a[px+1][py+1]=1;
            in[1]=true;
            dfs(dep+1);
            a[px][py]=0;
            a[px+1][py]=0;
            a[px+1][py+1]=0;
            in[1]=false;
        } 
        
    }
    
    //B:2cases
    if(!in[2]){
        
       if(a[px+1][py]==0&&a[px+2][py]==0&&a[px+3][py]==0){
          a[px][py]=2;
          a[px+1][py]=2;
          a[px+2][py]=2;
          a[px+3][py]=2;
          in[2]=true;
          dfs(dep+1);
          a[px][py]=0;
          a[px+1][py]=0;
          a[px+2][py]=0;
          a[px+3][py]=0;
          in[2]=false;
       }
       
       if(a[px][py+1]==0&&a[px][py+2]==0&&a[px][py+3]==0){
             a[px][py]=2;
          a[px][py+1]=2;
          a[px][py+2]=2;
          a[px][py+3]=2;
          in[2]=true;
          dfs(dep+1);
             a[px][py]=0;
          a[px][py+1]=0;
          a[px][py+2]=0;
          a[px][py+3]=0;
          in[2]=false;
       }
       
    }
    
    //C:8cases
    if(!in[3]){
        
       if(a[px+1][py]==0&&a[px+2][py]==0&&a[px][py+1]==0){
              a[px][py]=3;
           a[px+1][py]=3;
           a[px+2][py]=3;
           a[px][py+1]=3;
           in[3]=true;
           dfs(dep+1);
              a[px][py]=0;
           a[px+1][py]=0;
           a[px+2][py]=0;
           a[px][py+1]=0;
           in[3]=false;
       }
       
       if(a[px+1][py]==0&&a[px+1][py+1]==0&&a[px+1][py+2]==0){
              a[px][py]=3;
           a[px+1][py]=3;
           a[px+1][py+1]=3;
           a[px+1][py+2]=3;
           in[3]=true;
           dfs(dep+1);
           a[px][py]=0;
           a[px+1][py]=0;
           a[px+1][py+1]=0;
           a[px+1][py+2]=0;
           in[3]=false;
       }
       
       if(a[px+1][py]==0&&a[px][py+1]==0&&a[px][py+2]==0) {
              a[px][py]=3;
           a[px+1][py]=3;
           a[px][py+1]=3;
           a[px][py+2]=3;
           in[3]=true;
           dfs(dep+1);
           a[px][py]=0;
           a[px+1][py]=0;
           a[px][py+1]=0;
           a[px][py+2]=0;
           in[3]=false;
       }
       
       if(a[px+1][py]==0&&a[px+2][py]==0&&a[px+2][py+1]==0){
              a[px][py]=3;
           a[px+2][py]=3;
           a[px+2][py+1]=3;
           a[px+1][py]=3;
           in[3]=true;
           dfs(dep+1);
           a[px][py]=0;
           a[px+2][py]=0;
           a[px+2][py+1]=0;
           a[px+1][py]=0;
           in[3]=false;
       }  
       
       if(a[px+1][py+2]==0&&a[px][py+2]==0&&a[px][py+1]==0){
              a[px][py]=3;
           a[px+1][py+2]=3;
           a[px][py+2]=3;
           a[px][py+1]=3;
           in[3]=true;
           dfs(dep+1);
           a[px][py]=0;
           a[px+1][py+2]=0;
           a[px][py+2]=0;
           a[px][py+1]=0;
           in[3]=false;
       }
       
       if(a[px-1][py+2]==0&&a[px][py+1]==0&&a[px][py+2]==0) {
              a[px][py]=3;
           a[px-1][py+2]=3;
           a[px][py+1]=3;
           a[px][py+2]=3;
           in[3]=true;
           dfs(dep+1);
           a[px][py]=0;
           a[px-1][py+2]=0;
           a[px][py+1]=0;
           a[px][py+2]=0;
           in[3]=false;
       }
       
       if(a[px][py+1]==0&&a[px+1][py+1]==0&&a[px+2][py+1]==0){
              a[px][py]=3;
           a[px][py+1]=3;
           a[px+1][py+1]=3;
           a[px+2][py+1]=3;
           in[3]=true;
           dfs(dep+1);
           a[px][py]=0;
           a[px][py+1]=0;
           a[px+1][py+1]=0;
           a[px+2][py+1]=0;
           in[3]=false;
       }
       
       if(a[px][py+1]==0&&a[px-1][py+1]==0&&a[px-2][py+1]==0){
              a[px][py]=3;
           a[px][py+1]=3;
           a[px-1][py+1]=3;
           a[px-2][py+1]=3;
           in[3]=true;
           dfs(dep+1);
           a[px][py]=0;
           a[px][py+1]=0;
           a[px-1][py+1]=0;
           a[px-2][py+1]=0;
           in[3]=false;
       }
       
    }
    
    //D:1case
    if(!in[4]){
        
        if(a[px][py+1]==0&&a[px+1][py+1]==0&&a[px+1][py]==0){
           a[px][py]=4;
           a[px][py+1]=4;
           a[px+1][py+1]=4;
           a[px+1][py]=4;
           in[4]=true;
           dfs(dep+1);
           a[px][py]=0;
           a[px][py+1]=0;
           a[px+1][py+1]=0;
           a[px+1][py]=0;
           in[4]=false;
        } 
        
    }
    
    //E:4cases
    if(!in[5]){
        
      if(a[px+1][py]==0&&a[px+2][py]==0&&a[px][py+1]==0&&a[px][py+2]==0) {
             a[px][py]=5;
           a[px+1][py]=5;
           a[px+2][py]=5;
           a[px][py+1]=5;
           a[px][py+2]=5;
           in[5]=true;
           dfs(dep+1);
           a[px][py]=0;
           a[px+1][py]=0;
           a[px+2][py]=0;
           a[px][py+1]=0;
           a[px][py+2]=0;
           in[5]=false;
      }
      
      if(a[px+1][py]==0&&a[px+2][py]==0&&a[px][py-1]==0&&a[px][py-2]==0) {
             a[px][py]=5;
           a[px+1][py]=5;
           a[px+2][py]=5;
           a[px][py-1]=5;
           a[px][py-2]=5;
           in[5]=true;
           dfs(dep+1);
           a[px][py]=0;
           a[px+1][py]=0;
           a[px+2][py]=0;
           a[px][py-1]=0;
           a[px][py-2]=0;
           in[5]=false;
      }
      
      if(a[px][py+1]==0&&a[px][py+2]==0&&a[px+1][py+2]==0&&a[px+2][py+2]==0){
             a[px][py]=5;
           a[px][py+1]=5;
           a[px][py+2]=5;
           a[px+1][py+2]=5;
           a[px+2][py+2]=5;
           in[5]=true;
           dfs(dep+1);
           a[px][py]=0;
           a[px][py+1]=0;
           a[px][py+2]=0;
           a[px+1][py+2]=0;
           a[px+2][py+2]=0;
           in[5]=false;
      }
      
      if(a[px][py+1]==0&&a[px][py+2]==0&&a[px-1][py+2]==0&&a[px-2][py+2]==0){
             a[px][py]=5;
           a[px][py+1]=5;
           a[px][py+2]=5;
           a[px-1][py+2]=5;
           a[px-2][py+2]=5;
           in[5]=true;
           dfs(dep+1);
           a[px][py]=0;
           a[px][py+1]=0;
           a[px][py+2]=0;
           a[px-1][py+2]=0;
           a[px-2][py+2]=0;
           in[5]=false;
      }
      
    }
    
    //F:8cases
    if(!in[6]){
        
       if(a[px-1][py+1]==0&&a[px][py+1]==0&&a[px+1][py+1]==0&&a[px+2][py+1]==0){
           a[px][py]=6;
           a[px-1][py+1]=6;
           a[px][py+1]=6;
           a[px+1][py+1]=6;
           a[px+2][py+1]=6;
           in[6]=true;
           dfs(dep+1);
           a[px][py]=0;
           a[px-1][py+1]=0;
           a[px][py+1]=0;
           a[px+1][py+1]=0;
           a[px+2][py+1]=0;
           in[6]=false;
    } 
    
       if(a[px-1][py+1]==0&&a[px][py+1]==0&&a[px+1][py+1]==0&&a[px-2][py+1]==0) {
           a[px][py]=6;
           a[px-1][py+1]=6;
           a[px][py+1]=6;
           a[px+1][py+1]=6;
           a[px-2][py+1]=6;
           in[6]=true;
           dfs(dep+1);
           a[px][py]=0;
           a[px-1][py+1]=0;
           a[px][py+1]=0;
           a[px+1][py+1]=0;
           a[px-2][py+1]=0;
           in[6]=false;
    }
    
       if(a[px+1][py+1]==0&&a[px+1][py]==0&&a[px+2][py]==0&&a[px+3][py]==0) {
           a[px][py]=6;
           a[px+1][py+1]=6;
           a[px+1][py]=6;
           a[px+2][py]=6;
           a[px+3][py]=6;
           in[6]=true;
           dfs(dep+1);
           a[px][py]=0;
           a[px+1][py+1]=0;
           a[px+1][py]=0;
           a[px+2][py]=0;
           a[px+3][py]=0;
           in[6]=false;
    }
    
       if(a[px+1][py]==0&&a[px+2][py+1]==0&&a[px+2][py]==0&&a[px+3][py]==0) {
           a[px][py]=6;
           a[px+1][py]=6;
           a[px+2][py+1]=6;
           a[px+2][py]=6;
           a[px+3][py]=6;
           in[6]=true;
           dfs(dep+1);
           a[px][py]=0;
           a[px+1][py]=0;
           a[px+2][py+1]=0;
           a[px+2][py]=0;
           a[px+3][py]=0;
           in[6]=false;
    }
    
       if(a[px][py+1]==0&&a[px][py+2]==0&&a[px][py+3]==0&&a[px+1][py+1]==0){
           a[px][py]=6;
           a[px][py+1]=6;
           a[px][py+2]=6;
           a[px][py+3]=6;
           a[px+1][py+1]=6;
           in[6]=true;
           dfs(dep+1);
           a[px][py]=0;
           a[px][py+1]=0;
           a[px][py+2]=0;
           a[px][py+3]=0;
           a[px+1][py+1]=0;
           in[6]=false;
    } 
    
       if(a[px][py+1]==0&&a[px][py+2]==0&&a[px][py+3]==0&&a[px-1][py+1]==0) {
           a[px][py]=6;
           a[px][py+1]=6;
           a[px][py+2]=6;
           a[px][py+3]=6;
           a[px-1][py+1]=6;
           in[6]=true;
           dfs(dep+1);
           a[px][py]=0;
           a[px][py+1]=0;
           a[px][py+2]=0;
           a[px][py+3]=0;
           a[px-1][py+1]=0;
           in[6]=false;
    }
    
       if(a[px][py+1]==0&&a[px][py+2]==0&&a[px][py+3]==0&&a[px+1][py+2]==0) {
           a[px][py]=6;
           a[px][py+1]=6;
           a[px][py+2]=6;
           a[px][py+3]=6;
           a[px+1][py+2]=6;
           in[6]=true;
           dfs(dep+1);
           a[px][py]=0;
           a[px][py+1]=0;
           a[px][py+2]=0;
           a[px][py+3]=0;
           a[px+1][py+2]=0;
           in[6]=false;
    }
    
       if(a[px][py+1]==0&&a[px][py+2]==0&&a[px][py+3]==0&&a[px-1][py+2]==0) {
           a[px][py]=6;
           a[px][py+1]=6;
           a[px][py+2]=6;
           a[px][py+3]=6;
           a[px-1][py+2]=6;
           in[6]=true;
           dfs(dep+1);
           a[px][py]=0;
           a[px][py+1]=0;
           a[px][py+2]=0;
           a[px][py+3]=0;
           a[px-1][py+2]=0;
           in[6]=false;
       }
    }
    
    //G:4cases
    if(!in[7]){
        
       if(a[px][py+1]==0&&a[px+1][py]==0&&a[px+2][py+1]==0&&a[px+2][py]==0) {
              a[px][py]=7;
           a[px][py+1]=7;
           a[px+1][py]=7;
           a[px+2][py+1]=7;
           a[px+2][py]=7;
           in[7]=true;
           dfs(dep+1);
              a[px][py]=0;
           a[px][py+1]=0;
           a[px+1][py]=0;
           a[px+2][py+1]=0;
           a[px+2][py]=0;
           in[7]=false;
       }
       
       if(a[px][py+1]==0&&a[px+1][py+1]==0&&a[px+2][py+1]==0&&a[px+2][py]==0) {
              a[px][py]=7;
           a[px][py+1]=7;
           a[px+1][py+1]=7;
           a[px+2][py+1]=7;
           a[px+2][py]=7;
           in[7]=true;
           dfs(dep+1);
              a[px][py]=0;
           a[px][py+1]=0;
           a[px+1][py+1]=0;
           a[px+2][py+1]=0;
           a[px+2][py]=0;
           in[7]=false;
       }
       
       if(a[px][py+1]==0&&a[px][py+2]==0&&a[px+1][py+2]==0&&a[px+1][py]==0) {
              a[px][py]=7;
           a[px][py+1]=7;
           a[px][py+2]=7;
           a[px+1][py+2]=7;
           a[px+1][py]=7;
           in[7]=true;
           dfs(dep+1);
              a[px][py]=0;
           a[px][py+1]=0;
           a[px][py+2]=0;
           a[px+1][py+2]=0;
           a[px+1][py]=0;
           in[7]=false;
       }
       
       if(a[px+1][py]==0&&a[px+1][py+1]==0&&a[px+1][py+2]==0&&a[px][py+2]==0) {
              a[px][py]=7;
           a[px+1][py]=7;
           a[px+1][py+1]=7;
           a[px+1][py+2]=7;
           a[px][py+2]=7;
           in[7]=true;
           dfs(dep+1);
              a[px][py]=0;
           a[px+1][py]=0;
           a[px+1][py+1]=0;
           a[px+1][py+2]=0;
           a[px][py+2]=0;
           in[7]=false;
       }
       
    }
    
    //H:8cases
    if(!in[8]){
        
    if(a[px+1][py]==0&&a[px+1][py+1]==0&&a[px+2][py]==0&&a[px+2][py+1]==0) {
           a[px][py]=8;
           a[px+1][py]=8;
           a[px+1][py+1]=8;
           a[px+2][py]=8;
           a[px+2][py+1]=8;
           in[8]=true;
           dfs(dep+1);
           a[px][py]=0;
           a[px+1][py]=0;
           a[px+1][py+1]=0;
           a[px+2][py]=0;
           a[px+2][py+1]=0;
           in[8]=false;
    }
    
      if(a[px-1][py+1]==0&&a[px][py+1]==0&&a[px+1][py+1]==0&&a[px+1][py]==0) {
           a[px][py]=8;
           a[px-1][py+1]=8;
           a[px][py+1]=8;
           a[px+1][py+1]=8;
           a[px+1][py]=8;
           in[8]=true;
           dfs(dep+1);
           a[px][py]=0;
           a[px-1][py+1]=0;
           a[px][py+1]=0;
           a[px+1][py+1]=0;
           a[px+1][py]=0;
           in[8]=false;
    }
    
      if(a[px][py+1]==0&&a[px+1][py]==0&&a[px+1][py+1]==0&&a[px+2][py+1]==0) {
           a[px][py]=8;
           a[px+1][py]=8;
           a[px][py+1]=8;
           a[px+1][py+1]=8;
           a[px+2][py+1]=8;
           in[8]=true;
           dfs(dep+1);
           a[px][py]=0;
           a[px+1][py]=0;
           a[px][py+1]=0;
           a[px+1][py+1]=0;
           a[px+2][py+1]=0;
           in[8]=false;
    }
    
      if(a[px+1][py]==0&&a[px+2][py]==0&&a[px][py+1]==0&&a[px+1][py+1]==0){
           a[px][py]=8;
           a[px+1][py]=8;
           a[px+2][py]=8;
           a[px][py+1]=8;
           a[px+1][py+1]=8;
           in[8]=true;
           dfs(dep+1);
           a[px][py]=0;
           a[px+1][py]=0;
           a[px+2][py]=0;
           a[px][py+1]=0;
           a[px+1][py+1]=0;
           in[8]=false;
    } 
    
      if(a[px][py+1]==0&&a[px][py+2]==0&&a[px+1][py+1]==0&&a[px+1][py+2]==0) {
           a[px][py]=8;
           a[px][py+1]=8;
           a[px][py+2]=8;
           a[px+1][py+1]=8;
           a[px+1][py+2]=8;
           in[8]=true;
           dfs(dep+1);
           a[px][py]=0;
           a[px][py+1]=0;
           a[px][py+2]=0;
           a[px+1][py+1]=0;
           a[px+1][py+2]=0;
           in[8]=false;
    }
     
      if(a[px][py+1]==0&&a[px][py+2]==0&&a[px-1][py+1]==0&&a[px-1][py+2]==0){
           a[px][py]=8;
           a[px][py+1]=8;
           a[px][py+2]=8;
           a[px-1][py+1]=8;
           a[px-1][py+2]=8;
           in[8]=true;
           dfs(dep+1);
           a[px][py]=0;
           a[px][py+1]=0;
           a[px][py+2]=0;
           a[px-1][py+1]=0;
           a[px-1][py+2]=0;
           in[8]=false;
    }
    
      if(a[px][py+1]==0&&a[px][py+2]==0&&a[px+1][py]==0&&a[px+1][py+1]==0) {
           a[px][py]=8;
           a[px][py+1]=8;
           a[px][py+2]=8;
           a[px+1][py]=8;
           a[px+1][py+1]=8;
           in[8]=true;
           dfs(dep+1);
           a[px][py]=0;
           a[px][py+1]=0;
           a[px][py+2]=0;
           a[px+1][py]=0;
           a[px+1][py+1]=0;
           in[8]=false;
    }
    
      if(a[px][py+1]==0&&a[px+1][py+2]==0&&a[px+1][py+1]==0&&a[px+1][py]==0){
           a[px][py]=8;
           a[px][py+1]=8;
           a[px+1][py+2]=8;
           a[px+1][py+1]=8;
           a[px+1][py]=8;
           in[8]=true;
           dfs(dep+1);
           a[px][py]=0;
           a[px][py+1]=0;
           a[px+1][py+2]=0;
           a[px+1][py+1]=0;
           a[px+1][py]=0;
           in[8]=false;
       } 
    }
    
    //I:8cases
    if(!in[9]){
        
      if(a[px+1][py]==0&&a[px+2][py]==0&&a[px+2][py+1]==0&&a[px+3][py+1]==0){
           a[px][py]=9;
           a[px+1][py]=9;
           a[px+2][py]=9;
           a[px+2][py+1]=9;
           a[px+3][py+1]=9;
           in[9]=true;
           dfs(dep+1);
           a[px][py]=0;
           a[px+1][py]=0;
           a[px+2][py]=0;
           a[px+2][py+1]=0;
           a[px+3][py+1]=0;
           in[9]=false;
    }
    
      if(a[px-2][py+1]==0&&a[px-1][py+1]==0&&a[px][py+1]==0&&a[px+1][py]==0) {
           a[px][py]=9;
           a[px-2][py+1]=9;
           a[px-1][py+1]=9;
           a[px][py+1]=9;
           a[px+1][py]=9;
           in[9]=true;
           dfs(dep+1);
           a[px][py]=0;
           a[px-2][py+1]=0;
           a[px-1][py+1]=0;
           a[px][py+1]=0;
           a[px+1][py]=0;
           in[9]=false;
    }
    
      if(a[px+1][py]==0&&a[px+1][py+1]==0&&a[px+2][py+1]==0&&a[px+3][py+1]==0){
           a[px][py]=9;
           a[px+1][py]=9;
           a[px+1][py+1]=9;
           a[px+2][py+1]=9;
           a[px+3][py+1]=9;
           in[9]=true;
           dfs(dep+1);
           a[px][py]=0;
           a[px+1][py]=0;
           a[px+1][py+1]=0;
           a[px+2][py+1]=0;
           a[px+3][py+1]=0;
           in[9]=false;
    } 
    
      if(a[px][py+1]==0&&a[px-1][py+1]==0&&a[px-2][py+1]==0&&a[px+1][py]==0){
           a[px][py]=9;
           a[px][py+1]=9;
           a[px-1][py+1]=9;
           a[px-2][py+1]=9;
           a[px+1][py]=9;
           in[9]=true;
           dfs(dep+1);
           a[px][py]=0;
           a[px][py+1]=0;
           a[px-1][py+1]=0;
           a[px-2][py+1]=0;
           a[px+1][py]=0;
           in[9]=false;
    } 
    
      if(a[px][py+1]==0&&a[px+1][py+1]==0&&a[px+1][py+3]==0&&a[px+1][py+2]==0){
           a[px][py]=9;
           a[px][py+1]=9;
           a[px+1][py+1]=9;
           a[px+1][py+3]=9;
           a[px+1][py+2]=9;
           in[9]=true;
           dfs(dep+1);
           a[px][py]=0;
           a[px][py+1]=0;
           a[px+1][py+1]=0;
           a[px+1][py+3]=0;
           a[px+1][py+2]=0;
           in[9]=false;
    }
    
      if(a[px][py+1]==0&&a[px-1][py+1]==0&&a[px-1][py+3]==0&&a[px-1][py+2]==0){
           a[px][py]=9;
           a[px][py+1]=9;
           a[px-1][py+1]=9;
           a[px-1][py+3]=9;
           a[px-1][py+2]=9;
           in[9]=true;
           dfs(dep+1);
           a[px][py]=0;
           a[px][py+1]=0;
           a[px-1][py+1]=0;
           a[px-1][py+3]=0;
           a[px-1][py+2]=0;
           in[9]=false;
    }
    
      if(a[px][py+1]==0&&a[px][py+2]==0&&a[px+1][py+2]==0&&a[px+1][py+3]==0) {
           a[px][py]=9;
           a[px][py+1]=9;
           a[px][py+2]=9;
           a[px+1][py+2]=9;
           a[px+1][py+3]=9;
           in[9]=true;
           dfs(dep+1);
           a[px][py]=0;
           a[px][py+1]=0;
           a[px][py+2]=0;
           a[px+1][py+2]=0;
           a[px+1][py+3]=0;
           in[9]=false;
    }
    
      if(a[px][py+1]==0&&a[px][py+2]==0&&a[px-1][py+2]==0&&a[px-1][py+3]==0) {
           a[px][py]=9;
           a[px][py+1]=9;
           a[px][py+2]=9;
           a[px-1][py+2]=9;
           a[px-1][py+3]=9;
           in[9]=true;
           dfs(dep+1);
           a[px][py]=0;
           a[px][py+1]=0;
           a[px][py+2]=0;
           a[px-1][py+2]=0;
           a[px-1][py+3]=0;
           in[9]=false;
       }
       
    }
    
    //J:1case
    if(!in[10]){
        
      if(a[px][py+1]==0&&a[px][py+2]==0&&a[px-1][py+1]==0&&a[px+1][py+1]==0) {
           a[px][py]=10;
           a[px][py+1]=10;
           a[px][py+2]=10;
           a[px-1][py+1]=10;
           a[px+1][py+1]=10;
           in[10]=true;
           dfs(dep+1);
           a[px][py]=0;
           a[px][py+1]=0;
           a[px][py+2]=0;
           a[px-1][py+1]=0;
           a[px+1][py+1]=0;
           in[10]=false;
      }
      
    }
    
    //K:4cases
    if(!in[11]){
        
      if(a[px][py+1]==0&&a[px+1][py+1]==0&&a[px+1][py+2]==0&&a[px+2][py+2]==0) {
           a[px][py]=11;
           a[px][py+1]=11;
           a[px+1][py+1]=11;
           a[px+1][py+2]=11;
           a[px+2][py+2]=11;
           in[11]=true;
           dfs(dep+1);
           a[px][py]=0;
           a[px][py+1]=0;
           a[px+1][py+1]=0;
           a[px+1][py+2]=0;
           a[px+2][py+2]=0;
           in[11]=false;
    }
    
      if(a[px][py+1]==0&&a[px-1][py+1]==0&&a[px-1][py+2]==0&&a[px-2][py+2]==0) {
           a[px][py]=11;
           a[px][py+1]=11;
           a[px-1][py+1]=11;
           a[px-1][py+2]=11;
           a[px-2][py+2]=11;
           in[11]=true;
           dfs(dep+1);
           a[px][py]=0;
           a[px][py+1]=0;
           a[px-1][py+1]=0;
           a[px-1][py+2]=0;
           a[px-2][py+2]=0;
           in[11]=false;
    }
    
      if(a[px+1][py]==0&&a[px+1][py+1]==0&&a[px+2][py+1]==0&&a[px+2][py+2]==0){
           a[px][py]=11;
           a[px+1][py]=11;
           a[px+1][py+1]=11;
           a[px+2][py+1]=11;
           a[px+2][py+2]=11;
           in[11]=true;
           dfs(dep+1);
           a[px][py]=0;
           a[px+1][py]=0;
           a[px+1][py+1]=0;
           a[px+2][py+1]=0;
           a[px+2][py+2]=0;
           in[11]=false;
    }
    
      if(a[px+1][py]==0&&a[px][py+1]==0&&a[px-1][py+1]==0&&a[px-1][py+2]==0){
           a[px][py]=11;
           a[px][py+1]=11;
           a[px+1][py]=11;
           a[px-1][py+1]=11;
           a[px-1][py+2]=11;
           in[11]=true;
           dfs(dep+1);
           a[px][py]=0;
           a[px][py+1]=0;
           a[px+1][py]=0;
           a[px-1][py+1]=0;
           a[px-1][py+2]=0;
           in[11]=false;
       }
       
    }
    
    //L:8cases
    if(!in[12]){
        
      if(a[px][py+1]==0&&a[px+1][py]==0&&a[px+2][py]==0&&a[px+3][py]==0) {
           a[px][py]=12;
           a[px][py+1]=12;
           a[px+1][py]=12;
           a[px+2][py]=12;
           a[px+3][py]=12;
           in[12]=true;
           dfs(dep+1);
           a[px][py]=0;
           a[px][py+1]=0;
           a[px+1][py]=0;
           a[px+2][py]=0;
           a[px+3][py]=0;
           in[12]=false;
    }
    
      if(a[px+3][py+1]==0&&a[px+1][py]==0&&a[px+2][py]==0&&a[px+3][py]==0){
           a[px][py]=12;
           a[px+3][py+1]=12;
           a[px+1][py]=12;
           a[px+2][py]=12;
           a[px+3][py]=12;
           in[12]=true;
           dfs(dep+1);
           a[px][py]=0;
           a[px+3][py+1]=0;
           a[px+1][py]=0;
           a[px+2][py]=0;
           a[px+3][py]=0;
           in[12]=false;
    } 
    
      if(a[px][py+1]==0&&a[px+1][py+1]==0&&a[px+2][py+1]==0&&a[px+3][py+1]==0){
           a[px][py]=12;
           a[px][py+1]=12;
           a[px+1][py+1]=12;
           a[px+2][py+1]=12;
           a[px+3][py+1]=12;
           in[12]=true;
           dfs(dep+1);
           a[px][py]=0;
           a[px][py+1]=0;
           a[px+1][py+1]=0;
           a[px+2][py+1]=0;
           a[px+3][py+1]=0;
           in[12]=false;
    } 
    
      if(a[px][py+1]==0&&a[px-1][py+1]==0&&a[px-2][py+1]==0&&a[px-3][py+1]==0){
           a[px][py]=12;
           a[px][py+1]=12;
           a[px-1][py+1]=12;
           a[px-2][py+1]=12;
           a[px-3][py+1]=12;
           in[12]=true;
           dfs(dep+1);
           a[px][py]=0;
           a[px][py+1]=0;
           a[px-1][py+1]=0;
           a[px-2][py+1]=0;
           a[px-3][py+1]=0;
           in[12]=false;
    }
    
      if(a[px+1][py]==0&&a[px+1][py+1]==0&&a[px+1][py+2]==0&&a[px+1][py+3]==0) {
           a[px][py]=12;
           a[px+1][py]=12;
           a[px+1][py+1]=12;
           a[px+1][py+2]=12;
           a[px+1][py+3]=12;
           in[12]=true;
           dfs(dep+1);
           a[px][py]=0;
           a[px+1][py]=0;
           a[px+1][py+1]=0;
           a[px+1][py+2]=0;
           a[px+1][py+3]=0;
           in[12]=false;
    }
    
      if(a[px+1][py]==0&&a[px][py+1]==0&&a[px][py+2]==0&&a[px][py+3]==0){
           a[px][py]=12;
           a[px][py+1]=12;
           a[px+1][py]=12;
           a[px][py+2]=12;
           a[px][py+3]=12;
           in[12]=true;
           dfs(dep+1);
           a[px][py]=0;
           a[px][py+1]=0;
           a[px+1][py]=0;
           a[px][py+2]=0;
           a[px][py+3]=0;
           in[12]=false;
    } 
    
      if(a[px][py+1]==0&&a[px][py+2]==0&&a[px][py+3]==0&&a[px+1][py+3]==0) {
           a[px][py]=12;
           a[px][py+1]=12;
           a[px][py+2]=12;
           a[px][py+3]=12;
           a[px+1][py+3]=12;
           in[12]=true;
           dfs(dep+1);
           a[px][py]=0;
           a[px][py+1]=0;
           a[px][py+2]=0;
           a[px][py+3]=0;
           a[px+1][py+3]=0;
           in[12]=false;
    }
    
      if(a[px][py+1]==0&&a[px][py+2]==0&&a[px][py+3]==0&&a[px-1][py+3]==0) {
           a[px][py]=12;
           a[px][py+1]=12;
           a[px][py+2]=12;
           a[px][py+3]=12;
           a[px-1][py+3]=12;
           in[12]=true;
           dfs(dep+1);
           a[px][py]=0;
           a[px][py+1]=0;
           a[px][py+2]=0;
           a[px][py+3]=0;
           a[px-1][py+3]=0;
           in[12]=false;
       }
       
    }
    
}

void openfile(){
    freopen("game.in","r",stdin);
    freopen("game.out","w",stdout);
}

int main(){
 

   //openfile();
    init();
    dfs(1);
    printf("No solution");
    return 0;
}
dfs

 

posted @ 2023-11-08 10:14  JMXZ  阅读(17)  评论(0)    收藏  举报