题解 P4205 【[NOI2005]智障珠游戏 】

· · 题解

题解 P4205 [NOI2005]智慧珠游戏

先给大家简述一下题意:(不会玩智慧珠游戏的自己去百度一下)

写一个程序解决骨灰级智慧珠问题(只给出1~3个块,你需要自己填完剩下的9~11块)

数据保证至多有一组解。

假装分析一下:这是所有块的形状

由于图形可以旋转、翻折、跳跃,所以要先把12个零件的所有形状枚举出来:

总共只有60种情况,如果你觉得多的话请跳过此题解。

如果你不想用搜索做,请跳过此题解。

每次从上到下,从做到右找出第一个没有被放零件的格子。56种情况一一枚举就行了(剪枝想怎么搞怎么搞只要是对的就OK了)注意回溯。

听说有个点会卡顺序搜,那么就可以换个方向就行了(或者卡个搜索次数

代码不长,刚过千行。没有猪国杀的变态,没有mayan游戏的玄学,没有A+B问题的变幻无常,没有任何超纲。阻挡你向前的只是你的懒惰,是你的习得性无助。学OI的意义是什么?成为dalao的意义是什么?只有成为真正的码农,才无愧于你的内心。

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>

using namespace std;

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

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];

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;
        }
    }
    for(int i=1;i<=10;i++){
        for(int j=1;j<=i;j++){
            if(a[j][i]==-1) {
                a[j][i]=0;
            }
        }
    }
}

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(){
    ti++;

    if(ti>=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();
            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();
            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();
            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();
            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();
          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();
          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();
           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();
           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();
           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();
           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();
           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();
           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();
           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();
           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();
           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();
           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();
           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();
           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();
           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();
           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();
           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();
           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();
           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();
           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();
           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();
           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();
           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();
           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();
           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();
           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();
           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();
           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();
           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();
           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();
           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();
           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();
           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();
           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();
           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();
           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();
           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();
           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();
           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();
           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();
           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();
           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();
           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();
           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();
           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();
           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();
           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();
           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();
           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();
           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();
           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();
           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();
           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();
           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();
           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();
           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();
    printf("No solution");
    return 0;
}

恭喜你彻底农烂