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

题面

题目链接

P4205 [NOI2005]智慧珠游戏

题目描述

智慧珠游戏拼盘由一个三角形盘件和 12 个形态各异的零件组成。拼盘的盘 件如图1所示

图1

图2

图3

对于由珠子构成的零件,可以放到盘件的任一位置,条件是能有地方放,且尺寸合适,所有的零件都允许旋转(0º、90º、180º、270º)和翻转(水平、竖直)。

现给出一个盘件的初始布局,求一种可行的智慧珠摆放方案,使所有的零件都能放进盘件中。

输入输出格式

输入格式

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

输出格式

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

输入输出样例

输入样例

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

输出样例

B
BK
BKK
BJKK
JJJDD
GJGDDC
GGGCCCI
EEEHHIIA
ELHHHIAAF
ELLLLIFFFF

说明

1000ms,128MB

思路

请手打暴搜(听说可以舞蹈链,但我不会)

另外,可以先判连通块大小优化一下,如果有连通块大小小于等于2,那肯定无解

AC代码

#include<bits/stdc++.h>
#define ok =='.'
#define tr =ch
#define cl ='.'
using namespace std;

char MAP[20][20];
bool vis[15],VIS[20][20];
int num[20][20];

int DFS(int x,int y)
{
    if(VIS[x][y]) return 0;
    VIS[x][y]=1;
    if(MAP[x][y]!='.') return 0;
    return 1+DFS(x+1,y)+DFS(x-1,y)+DFS(x,y+1)+DFS(x,y-1);
}

void dfs(int x,int y)
{
    if(x==11)
    {
        for(int i=1;i<=10;i++)
        {
            for(int j=1;j<=i;j++)
            cout<<MAP[i][j];
            cout<<endl;
        }
        exit(0);
    }
    if(y==x+1) {dfs(x+1,1);return;}
    if(!(MAP[x][y]ok)) {dfs(x,y+1);return;}

    char ch;

    ch='J';
    if(!vis[10])
    {
        vis[10]=true;MAP[x][y]tr;
        if(MAP[x+1][y]ok && MAP[x+2][y]ok && MAP[x+1][y-1]ok && MAP[x+1][y+1]ok)
        {
            MAP[x+1][y]tr,MAP[x+2][y]tr,MAP[x+1][y-1]tr,MAP[x+1][y+1]tr;
            dfs(x,y+1);
            MAP[x+1][y]cl,MAP[x+2][y]cl,MAP[x+1][y-1]cl,MAP[x+1][y+1]cl;
        }
        vis[10]=false;MAP[x][y]cl;
    }

    ch='D';
    if(!vis[4])
    {
        vis[4]=true;MAP[x][y]tr;
        if(MAP[x+1][y]ok && MAP[x][y+1]ok && MAP[x+1][y+1]ok)
        {
            MAP[x+1][y]tr,MAP[x][y+1]tr,MAP[x+1][y+1]tr;
            dfs(x,y+1);
            MAP[x+1][y]cl,MAP[x][y+1]cl,MAP[x+1][y+1]cl;
        }
        vis[4]=false;MAP[x][y]cl;
    }

    ch='B';
    if(!vis[2])
    {
        vis[2]=true;MAP[x][y]tr;
        if(MAP[x+1][y]ok && MAP[x+2][y]ok && MAP[x+3][y]ok)
        {
            MAP[x+1][y]tr,MAP[x+2][y]tr,MAP[x+3][y]tr;
            dfs(x,y+1);
            MAP[x+1][y]cl,MAP[x+2][y]cl,MAP[x+3][y]cl;
        }
        if(MAP[x][y+1]ok && MAP[x][y+2]ok && MAP[x][y+3]ok)
        {
            MAP[x][y+1]tr,MAP[x][y+2]tr,MAP[x][y+3]tr;
            dfs(x,y+1);
            MAP[x][y+1]cl,MAP[x][y+2]cl,MAP[x][y+3]cl;
        }
        vis[2]=false;MAP[x][y]cl;
    }

    ch='K';
    if(!vis[11])
    {
        vis[11]=true;MAP[x][y]tr;
        if(MAP[x+1][y]ok && MAP[x+1][y+1]ok && MAP[x+2][y+1]ok && MAP[x+2][y+2]ok)
        {
            MAP[x+1][y]tr,MAP[x+1][y+1]tr,MAP[x+2][y+1]tr,MAP[x+2][y+2]tr;
            dfs(x,y+1);
            MAP[x+1][y]cl,MAP[x+1][y+1]cl,MAP[x+2][y+1]cl,MAP[x+2][y+2]cl;
        }
        if(MAP[x][y+1]ok && MAP[x+1][y+1]ok && MAP[x+1][y+2]ok && MAP[x+2][y+2]ok)
        {
            MAP[x][y+1]tr,MAP[x+1][y+1]tr,MAP[x+1][y+2]tr,MAP[x+2][y+2]tr;
            dfs(x,y+1);
            MAP[x][y+1]cl,MAP[x+1][y+1]cl,MAP[x+1][y+2]cl,MAP[x+2][y+2]cl;
        }
        if(y>2 && MAP[x+1][y]ok && MAP[x+1][y-1]ok && MAP[x+2][y-1]ok && MAP[x+2][y-2]ok)
        {
            MAP[x+1][y]tr,MAP[x+1][y-1]tr,MAP[x+2][y-1]tr,MAP[x+2][y-2]tr;
            dfs(x,y+1);
            MAP[x+1][y]cl,MAP[x+1][y-1]cl,MAP[x+2][y-1]cl,MAP[x+2][y-2]cl;
        }
        if(MAP[x+1][y]ok && MAP[x+1][y-1]ok && MAP[x+2][y-1]ok && MAP[x+1][y]ok)
        {
            MAP[x+1][y]tr,MAP[x+1][y-1]tr,MAP[x+2][y-1]tr,MAP[x+1][y]tr;
            dfs(x,y+1);
            MAP[x+1][y]cl,MAP[x+1][y-1]cl,MAP[x+2][y-1]cl,MAP[x+1][y]cl;
        }
        vis[11]=false;MAP[x][y]cl;
    }

    ch='G';
    if(!vis[7])
    {
        vis[7]=true;MAP[x][y]tr;
        if(MAP[x+1][y]ok && MAP[x+2][y]ok && MAP[x][y+1]ok && MAP[x+2][y+1]ok)
        {
            MAP[x+1][y]tr,MAP[x+2][y]tr,MAP[x][y+1]tr,MAP[x+2][y+1]tr;
            dfs(x,y+1);
            MAP[x+1][y]cl,MAP[x+2][y]cl,MAP[x][y+1]cl,MAP[x+2][y+1]cl;
        }
        if(MAP[x+1][y+1]ok && MAP[x+2][y]ok && MAP[x][y+1]ok && MAP[x+2][y+1]ok)
        {
            MAP[x+1][y+1]tr,MAP[x+2][y]tr,MAP[x][y+1]tr,MAP[x+2][y+1]tr;
            dfs(x,y+1);
            MAP[x+1][y+1]cl,MAP[x+2][y]cl,MAP[x][y+1]cl,MAP[x+2][y+1]cl;
        }
        if(MAP[x][y+1]ok && MAP[x][y+2]ok && MAP[x+1][y+2]ok && MAP[x+1][y]ok)
        {
            MAP[x][y+1]tr,MAP[x][y+2]tr,MAP[x+1][y+2]tr,MAP[x+1][y]tr;
            dfs(x,y+1);
            MAP[x][y+1]cl,MAP[x][y+2]cl,MAP[x+1][y+2]cl,MAP[x+1][y]cl;
        }
        if(MAP[x+1][y+1]ok && MAP[x][y+2]ok && MAP[x+1][y+2]ok && MAP[x+1][y]ok)
        {
            MAP[x+1][y+1]tr,MAP[x][y+2]tr,MAP[x+1][y+2]tr,MAP[x+1][y]tr;
            dfs(x,y+1);
            MAP[x+1][y+1]cl,MAP[x][y+2]cl,MAP[x+1][y+2]cl,MAP[x+1][y]cl;
        }
        vis[7]=false;MAP[x][y]cl;
    }

    ch='E';
    if(!vis[5])
    {
        vis[5]=true;MAP[x][y]tr;
        if(MAP[x+1][y]ok && MAP[x+2][y]ok && MAP[x][y+1]ok && MAP[x][y+2]ok)
        {
            MAP[x+1][y]tr,MAP[x+2][y]tr,MAP[x][y+1]tr,MAP[x][y+2]tr;
            dfs(x,y+1);
            MAP[x+1][y]cl,MAP[x+2][y]cl,MAP[x][y+1]cl,MAP[x][y+2]cl;
        }
        if(MAP[x+1][y]ok && MAP[x+2][y]ok && MAP[x+2][y+1]ok && MAP[x+2][y+2]ok)
        {
            MAP[x+1][y]tr,MAP[x+2][y]tr,MAP[x+2][y+1]tr,MAP[x+2][y+2]tr;
            dfs(x,y+1);
            MAP[x+1][y]cl,MAP[x+2][y]cl,MAP[x+2][y+1]cl,MAP[x+2][y+2]cl;
        }
        if(y>2 && MAP[x+1][y]ok && MAP[x+2][y]ok && MAP[x+2][y-1]ok && MAP[x+2][y-2]ok)
        {
            MAP[x+1][y]tr,MAP[x+2][y]tr,MAP[x+2][y-1]tr,MAP[x+2][y-2]tr;
            dfs(x,y+1);
            MAP[x+1][y]cl,MAP[x+2][y]cl,MAP[x+2][y-1]cl,MAP[x+2][y-2]cl;
        }
        if(MAP[x+2][y+1]ok && MAP[x+2][y+2]ok && MAP[x+1][y]ok && MAP[x+2][y]ok)
        {
            MAP[x+2][y+1]tr,MAP[x+2][y+2]tr,MAP[x+1][y]tr,MAP[x+2][y]tr;
            dfs(x,y+1);
            MAP[x+2][y+1]cl,MAP[x+2][y+2]cl,MAP[x+1][y]cl,MAP[x+2][y]cl;
        }
        vis[5]=false;MAP[x][y]cl;
    }

    ch='A';
    if(!vis[1])
    {
        vis[1]=true;MAP[x][y]tr;
        if(MAP[x+1][y]ok && MAP[x][y+1]ok)
        {
            MAP[x+1][y]tr,MAP[x][y+1]tr;
            dfs(x,y+1);
            MAP[x+1][y]cl,MAP[x][y+1]cl;
        }
        if(MAP[x+1][y+1]ok && MAP[x][y+1]ok)
        {
            MAP[x+1][y+1]tr,MAP[x][y+1]tr;
            dfs(x,y+1);
            MAP[x+1][y+1]cl,MAP[x][y+1]cl;
        }
        if(MAP[x+1][y]ok && MAP[x+1][y+1]ok)
        {
            MAP[x+1][y]tr,MAP[x+1][y+1]tr;
            dfs(x,y+1);
            MAP[x+1][y]cl,MAP[x+1][y+1]cl;
        }
        if(MAP[x+1][y]ok && MAP[x+1][y-1]ok)
        {
            MAP[x+1][y]tr,MAP[x+1][y-1]tr;
            dfs(x,y+1);
            MAP[x+1][y]cl,MAP[x+1][y-1]cl;
        }
        vis[1]=false;MAP[x][y]cl;
    }

    ch='I';
    if(!vis[9])
    {
        vis[9]=true;MAP[x][y]tr;
        if(MAP[x+1][y+1]ok && MAP[x][y+1]ok && MAP[x+1][y+2]ok && MAP[x+1][y+3]ok)
        {
            MAP[x+1][y+1]tr,MAP[x][y+1]tr,MAP[x+1][y+2]tr,MAP[x+1][y+3]tr;
            dfs(x,y+1);
            MAP[x+1][y+1]cl,MAP[x][y+1]cl,MAP[x+1][y+2]cl,MAP[x+1][y+3]cl;
        }
        if(MAP[x+1][y]ok && MAP[x+1][y-1]ok && MAP[x][y+2]ok && MAP[x][y+1]ok)
        {
            MAP[x+1][y]tr,MAP[x+1][y-1]tr,MAP[x][y+2]tr,MAP[x][y+1]tr;
            dfs(x,y+1);
            MAP[x+1][y]cl,MAP[x+1][y-1]cl,MAP[x][y+2]cl,MAP[x][y+1]cl;
        }
        if(MAP[x+1][y+2]ok && MAP[x][y+1]ok && MAP[x][y+2]ok && MAP[x+1][y+3]ok)
        {
            MAP[x+1][y+2]tr,MAP[x][y+1]tr,MAP[x][y+2]tr,MAP[x+1][y+3]tr;
            dfs(x,y+1);
            MAP[x+1][y+2]cl,MAP[x][y+1]cl,MAP[x][y+2]cl,MAP[x+1][y+3]cl;
        }
        if(y>2 && MAP[x+1][y]ok && MAP[x][y+1]ok && MAP[x+1][y-2]ok && MAP[x+1][y-1]ok)
        {
            MAP[x+1][y]tr,MAP[x][y+1]tr,MAP[x+1][y-2]tr,MAP[x+1][y-1]tr;
            dfs(x,y+1);
            MAP[x+1][y]cl,MAP[x][y+1]cl,MAP[x+1][y-2]cl,MAP[x+1][y-1]cl;
        }
        if(MAP[x+2][y]ok && MAP[x+1][y]ok && MAP[x+2][y+1]ok && MAP[x+3][y+1]ok)
        {
            MAP[x+2][y]tr,MAP[x+1][y]tr,MAP[x+2][y+1]tr,MAP[x+3][y+1]tr;
            dfs(x,y+1);
            MAP[x+2][y]cl,MAP[x+1][y]cl,MAP[x+2][y+1]cl,MAP[x+3][y+1]cl;
        }
        if(MAP[x+1][y+1]ok && MAP[x+1][y]ok && MAP[x+2][y+1]ok && MAP[x+3][y+1]ok)
        {
            MAP[x+1][y+1]tr,MAP[x+1][y]tr,MAP[x+2][y+1]tr,MAP[x+3][y+1]tr;
            dfs(x,y+1);
            MAP[x+1][y+1]cl,MAP[x+1][y]cl,MAP[x+2][y+1]cl,MAP[x+3][y+1]cl;
        }
        if(MAP[x+2][y]ok && MAP[x+1][y]ok && MAP[x+2][y-1]ok && MAP[x+3][y-1]ok)
        {
            MAP[x+2][y]tr,MAP[x+1][y]tr,MAP[x+2][y-1]tr,MAP[x+3][y-1]tr;
            dfs(x,y+1);
            MAP[x+2][y]cl,MAP[x+1][y]cl,MAP[x+2][y-1]cl,MAP[x+3][y-1]cl;
        }
        if(MAP[x+1][y-1]ok && MAP[x+1][y]ok && MAP[x+2][y-1]ok && MAP[x+3][y-1]ok)
        {
            MAP[x+1][y-1]tr,MAP[x+1][y]tr,MAP[x+2][y-1]tr,MAP[x+3][y-1]tr;
            dfs(x,y+1);
            MAP[x+1][y-1]cl,MAP[x+1][y]cl,MAP[x+2][y-1]cl,MAP[x+3][y-1]cl;
        }
        vis[9]=false;MAP[x][y]cl;
    }

    ch='H';
    if(!vis[8])
    {
        vis[8]=true;MAP[x][y]tr;
        if(MAP[x+1][y]ok && MAP[x+2][y]ok && MAP[x+1][y+1]ok && MAP[x+2][y+1]ok)
        {
            MAP[x+1][y]tr,MAP[x+2][y]tr,MAP[x+1][y+1]tr,MAP[x+2][y+1]tr;
            dfs(x,y+1);
            MAP[x+1][y]cl,MAP[x+2][y]cl,MAP[x+1][y+1]cl,MAP[x+2][y+1]cl;
        }
        if(MAP[x+1][y]ok && MAP[x+2][y]ok && MAP[x+1][y-1]ok && MAP[x+2][y-1]ok)
        {
            MAP[x+1][y]tr,MAP[x+2][y]tr,MAP[x+1][y-1]tr,MAP[x+2][y-1]tr;
            dfs(x,y+1);
            MAP[x+1][y]cl,MAP[x+2][y]cl,MAP[x+1][y-1]cl,MAP[x+2][y-1]cl;
        }
        if(MAP[x+1][y]ok && MAP[x+2][y]ok && MAP[x+1][y+1]ok && MAP[x][y+1]ok)
        {
            MAP[x+1][y]tr,MAP[x+2][y]tr,MAP[x+1][y+1]tr,MAP[x][y+1]tr;
            dfs(x,y+1);
            MAP[x+1][y]cl,MAP[x+2][y]cl,MAP[x+1][y+1]cl,MAP[x][y+1]cl;
        }
        if(MAP[x+1][y]ok && MAP[x+2][y+1]ok && MAP[x+1][y+1]ok && MAP[x][y+1]ok)
        {
            MAP[x+1][y]tr,MAP[x+2][y+1]tr,MAP[x+1][y+1]tr,MAP[x][y+1]tr;
            dfs(x,y+1);
            MAP[x+1][y]cl,MAP[x+2][y+1]cl,MAP[x+1][y+1]cl,MAP[x][y+1]cl;
        }
        if(MAP[x+1][y]ok && MAP[x][y+1]ok && MAP[x+1][y+1]ok && MAP[x][y+2]ok)
        {
            MAP[x+1][y]tr,MAP[x][y+1]tr,MAP[x+1][y+1]tr,MAP[x][y+2]tr;
            dfs(x,y+1);
            MAP[x+1][y]cl,MAP[x][y+1]cl,MAP[x+1][y+1]cl,MAP[x][y+2]cl;
        }
        if(MAP[x+1][y]ok && MAP[x][y+1]ok && MAP[x+1][y+1]ok && MAP[x+1][y+2]ok)
        {
            MAP[x+1][y]tr,MAP[x][y+1]tr,MAP[x+1][y+1]tr,MAP[x+1][y+2]tr;
            dfs(x,y+1);
            MAP[x+1][y]cl,MAP[x][y+1]cl,MAP[x+1][y+1]cl,MAP[x+1][y+2]cl;
        }
        if(MAP[x][y+2]ok && MAP[x][y+1]ok && MAP[x+1][y+1]ok && MAP[x+1][y+2]ok)
        {
            MAP[x][y+2]tr,MAP[x][y+1]tr,MAP[x+1][y+1]tr,MAP[x+1][y+2]tr;
            dfs(x,y+1);
            MAP[x][y+2]cl,MAP[x][y+1]cl,MAP[x+1][y+1]cl,MAP[x+1][y+2]cl;
        }
        if(MAP[x+1][y]ok && MAP[x][y+1]ok && MAP[x+1][y+1]ok && MAP[x+1][y-1]ok)
        {
            MAP[x+1][y]tr,MAP[x][y+1]tr,MAP[x+1][y+1]tr,MAP[x+1][y-1]tr;
            dfs(x,y+1);
            MAP[x+1][y]cl,MAP[x][y+1]cl,MAP[x+1][y+1]cl,MAP[x+1][y-1]cl;
        }
        vis[8]=false;MAP[x][y]cl;
    }

    ch='F';
    if(!vis[6])
    {
        vis[6]=true;MAP[x][y]tr;
        if(MAP[x+1][y+1]ok && MAP[x][y+1]ok && MAP[x][y+2]ok && MAP[x][y+3]ok)
        {
            MAP[x+1][y+1]tr,MAP[x][y+1]tr,MAP[x][y+2]tr,MAP[x][y+3]tr;
            dfs(x,y+1);
            MAP[x+1][y+1]cl,MAP[x][y+1]cl,MAP[x][y+2]cl,MAP[x][y+3]cl;
        }
        if(MAP[x+1][y+2]ok && MAP[x][y+1]ok && MAP[x][y+2]ok && MAP[x][y+3]ok)
        {
            MAP[x+1][y+2]tr,MAP[x][y+1]tr,MAP[x][y+2]tr,MAP[x][y+3]tr;
            dfs(x,y+1);
            MAP[x+1][y+2]cl,MAP[x][y+1]cl,MAP[x][y+2]cl,MAP[x][y+3]cl;
        }
        if(MAP[x+1][y+1]ok && MAP[x+1][y]ok && MAP[x+2][y]ok && MAP[x+3][y]ok)
        {
            MAP[x+1][y+1]tr,MAP[x+1][y]tr,MAP[x+2][y]tr,MAP[x+3][y]tr;
            dfs(x,y+1);
            MAP[x+1][y+1]cl,MAP[x+1][y]cl,MAP[x+2][y]cl,MAP[x+3][y]cl;
        }
        if(MAP[x+2][y+1]ok && MAP[x+1][y]ok && MAP[x+2][y]ok && MAP[x+3][y]ok)
        {
            MAP[x+2][y+1]tr,MAP[x+1][y]tr,MAP[x+2][y]tr,MAP[x+3][y]tr;
            dfs(x,y+1);
            MAP[x+2][y+1]cl,MAP[x+1][y]cl,MAP[x+2][y]cl,MAP[x+3][y]cl;
        }
        if(MAP[x+1][y-1]ok && MAP[x+1][y]ok && MAP[x+2][y]ok && MAP[x+3][y]ok)
        {
            MAP[x+1][y-1]tr,MAP[x+1][y]tr,MAP[x+2][y]tr,MAP[x+3][y]tr;
            dfs(x,y+1);
            MAP[x+1][y-1]cl,MAP[x+1][y]cl,MAP[x+2][y]cl,MAP[x+3][y]cl;
        }
        if(MAP[x+2][y-1]ok && MAP[x+1][y]ok && MAP[x+2][y]ok && MAP[x+3][y]ok)
        {
            MAP[x+2][y-1]tr,MAP[x+1][y]tr,MAP[x+2][y]tr,MAP[x+3][y]tr;
            dfs(x,y+1);
            MAP[x+2][y-1]cl,MAP[x+1][y]cl,MAP[x+2][y]cl,MAP[x+3][y]cl;
        }
        if(MAP[x+1][y]ok && MAP[x+1][y+1]ok && MAP[x+1][y+2]ok && MAP[x+1][y-1]ok)
        {
            MAP[x+1][y]tr,MAP[x+1][y+1]tr,MAP[x+1][y+2]tr,MAP[x+1][y-1]tr;
            dfs(x,y+1);
            MAP[x+1][y]cl,MAP[x+1][y+1]cl,MAP[x+1][y+2]cl,MAP[x+1][y-1]cl;
        }
        if(y>2 && MAP[x+1][y]ok && MAP[x+1][y+1]ok && MAP[x+1][y-2]ok && MAP[x+1][y-1]ok)
        {
            MAP[x+1][y]tr,MAP[x+1][y+1]tr,MAP[x+1][y-2]tr,MAP[x+1][y-1]tr;
            dfs(x,y+1);
            MAP[x+1][y]cl,MAP[x+1][y+1]cl,MAP[x+1][y-2]cl,MAP[x+1][y-1]cl;
        }
        vis[6]=false;MAP[x][y]cl;
    }

    ch='L';
    if(!vis[12])
    {
        vis[12]=true;MAP[x][y]tr;
        if(MAP[x+1][y]ok && MAP[x][y+1]ok && MAP[x][y+2]ok && MAP[x][y+3]ok)
        {
            MAP[x+1][y]tr,MAP[x][y+1]tr,MAP[x][y+2]tr,MAP[x][y+3]tr;
            dfs(x,y+1);
            MAP[x+1][y]cl,MAP[x][y+1]cl,MAP[x][y+2]cl,MAP[x][y+3]cl;
        }
        if(MAP[x+1][y]ok && MAP[x+1][y+1]ok && MAP[x+1][y+2]ok && MAP[x+1][y+3]ok)
        {
            MAP[x+1][y]tr,MAP[x+1][y+1]tr,MAP[x+1][y+2]tr,MAP[x+1][y+3]tr;
            dfs(x,y+1);
            MAP[x+1][y]cl,MAP[x+1][y+1]cl,MAP[x+1][y+2]cl,MAP[x+1][y+3]cl;
        }
        if(y>3 && MAP[x+1][y]ok && MAP[x+1][y-1]ok && MAP[x+1][y-2]ok && MAP[x+1][y-3]ok)
        {
            MAP[x+1][y]tr,MAP[x+1][y-1]tr,MAP[x+1][y-2]tr,MAP[x+1][y-3]tr;
            dfs(x,y+1);
            MAP[x+1][y]cl,MAP[x+1][y-1]cl,MAP[x+1][y-2]cl,MAP[x+1][y-3]cl;
        }
        if(MAP[x+1][y+3]ok && MAP[x][y+1]ok && MAP[x][y+2]ok && MAP[x][y+3]ok)
        {
            MAP[x+1][y+3]tr,MAP[x][y+1]tr,MAP[x][y+2]tr,MAP[x][y+3]tr;
            dfs(x,y+1);
            MAP[x+1][y+3]cl,MAP[x][y+1]cl,MAP[x][y+2]cl,MAP[x][y+3]cl;
        }
        if(MAP[x][y+1]ok && MAP[x+1][y+1]ok && MAP[x+2][y+1]ok && MAP[x+3][y+1]ok)
        {
            MAP[x][y+1]tr,MAP[x+1][y+1]tr,MAP[x+2][y+1]tr,MAP[x+3][y+1]tr;
            dfs(x,y+1);
            MAP[x][y+1]cl,MAP[x+1][y+1]cl,MAP[x+2][y+1]cl,MAP[x+3][y+1]cl;
        }
        if(MAP[x][y+1]ok && MAP[x+1][y]ok && MAP[x+2][y]ok && MAP[x+3][y]ok)
        {
            MAP[x][y+1]tr,MAP[x+1][y]tr,MAP[x+2][y]tr,MAP[x+3][y]tr;
            dfs(x,y+1);
            MAP[x][y+1]cl,MAP[x+1][y]cl,MAP[x+2][y]cl,MAP[x+3][y]cl;
        }
        if(MAP[x+3][y-1]ok && MAP[x+1][y]ok && MAP[x+2][y]ok && MAP[x+3][y]ok)
        {
            MAP[x+3][y-1]tr,MAP[x+1][y]tr,MAP[x+2][y]tr,MAP[x+3][y]tr;
            dfs(x,y+1);
            MAP[x+3][y-1]cl,MAP[x+1][y]cl,MAP[x+2][y]cl,MAP[x+3][y]cl;
        }
        if(MAP[x+3][y+1]ok && MAP[x+1][y]ok && MAP[x+2][y]ok && MAP[x+3][y]ok)
        {
            MAP[x+3][y+1]tr,MAP[x+1][y]tr,MAP[x+2][y]tr,MAP[x+3][y]tr;
            dfs(x,y+1);
            MAP[x+3][y+1]cl,MAP[x+1][y]cl,MAP[x+2][y]cl,MAP[x+3][y]cl;
        }
        vis[12]=false;MAP[x][y]cl;
    }

    ch='C';
    if(!vis[3])
    {
        vis[3]=true;MAP[x][y]tr;
        if(MAP[x+1][y]ok && MAP[x+2][y]ok && MAP[x][y+1]ok)
        {
            MAP[x+1][y]tr,MAP[x+2][y]tr,MAP[x][y+1]tr;
            dfs(x,y+1);
            MAP[x+1][y]cl,MAP[x+2][y]cl,MAP[x][y+1]cl;
        }
        if(MAP[x+1][y]ok && MAP[x+1][y+1]ok && MAP[x+1][y+2]ok)
        {
            MAP[x+1][y]tr,MAP[x+1][y+1]tr,MAP[x+1][y+2]tr;
            dfs(x,y+1);
            MAP[x+1][y]cl,MAP[x+1][y+1]cl,MAP[x+1][y+2]cl;
        }
        if(y>2 && MAP[x+1][y]ok && MAP[x+1][y-1]ok && MAP[x+1][y-2]ok)
        {
            MAP[x+1][y]tr,MAP[x+1][y-1]tr,MAP[x+1][y-2]tr;
            dfs(x,y+1);
            MAP[x+1][y]cl,MAP[x+1][y-1]cl,MAP[x+1][y-2]cl;
        }
        if(MAP[x+1][y]ok && MAP[x+2][y]ok && MAP[x+2][y+1]ok)
        {
            MAP[x+1][y]tr,MAP[x+2][y]tr,MAP[x+2][y+1]tr;
            dfs(x,y+1);
            MAP[x+1][y]cl,MAP[x+2][y]cl,MAP[x+2][y+1]cl;
        }
        if(MAP[x+1][y]ok && MAP[x][y+1]ok && MAP[x][y+2]ok)
        {
            MAP[x+1][y]tr,MAP[x][y+1]tr,MAP[x][y+2]tr;
            dfs(x,y+1);
            MAP[x+1][y]cl,MAP[x][y+1]cl,MAP[x][y+2]cl;
        }
        if(MAP[x+1][y]ok && MAP[x+2][y]ok && MAP[x+2][y-1]ok)
        {
            MAP[x+1][y]tr,MAP[x+2][y]tr,MAP[x+2][y-1]tr;
            dfs(x,y+1);
            MAP[x+1][y]cl,MAP[x+2][y]cl,MAP[x+2][y-1]cl;
        }
        if(MAP[x][y+1]ok && MAP[x][y+2]ok && MAP[x+1][y+2]ok)
        {
            MAP[x][y+1]tr,MAP[x][y+2]tr,MAP[x+1][y+2]tr;
            dfs(x,y+1);
            MAP[x][y+1]cl,MAP[x][y+2]cl,MAP[x+1][y+2]cl;
        }
        if(MAP[x][y+1]ok && MAP[x+1][y+1]ok && MAP[x+2][y+1]ok)
        {
            MAP[x][y+1]tr,MAP[x+1][y+1]tr,MAP[x+2][y+1]tr;
            dfs(x,y+1);
            MAP[x][y+1]cl,MAP[x+1][y+1]cl,MAP[x+2][y+1]cl;
        }
        vis[3]=false;MAP[x][y]cl;
    }

}

int main()
{
    for(int i=1;i<=10;i++)
        for(int j=1;j<=i;j++)
        {
            cin>>MAP[i][j];
            if(MAP[i][j]>='A' && MAP[i][j]<='L') vis[MAP[i][j]-'A'+1]=true;
        }
    for(int i=1;i<=10;i++)
        for(int j=1;j<=i;j++)
        {
            int n=DFS(i,j);
            if(n && n<=2) goto lskakioi;
        }
    dfs(1,1);
    lskakioi:
    printf("No solution");
    return 0;
}

总结

这是今天考试题。。。下来一看,错了8个地方,时间也浪费了。所以这种长的题,就应该多检查几遍。

(感觉有写猪国杀的动力了)

转载于:https://www.cnblogs.com/Mercury04/p/9805048.html

<think>嗯,用户想了解如何用分块方法解决洛谷P2042这个维护数列的问题。首先,我需要回忆一下分块算法的基本概念。分块通常是将数据分成多个块,每个块单独处理,平衡查询和修改的时间复杂度。不过,题目是NOI2005的,可能比较复杂,因为维护数列通常涉及插入、删除、区间修改、翻转、求和、最大子段和等操作。分块处理这些操作可能比较麻烦,尤其是动态的插入和删除,会导致块的大小变化,影响效率。 首先,我得确认分块是否适合这个问题。一般来说,分块的时间复杂度是O(n√n),对于大数可能还行,但像这种NOI题目可能数据量较大,分块可能不够高效,不过用户明确问分块方法,所以需要找到如何结构设计。 维护数列的典型操作包括:在某个位置插入一段数列,删除某个区间,区间覆盖,区间翻转,区间求和,求最大子段和。分块的话,每个块需要维护这些操作的信息。比如每个块需要记录翻转标记、覆盖标记,以及各种区间和、最大子段和等。 接下来,分块的结构设计。每个块可以存储一个数组,同时维护块内的总和、最大前缀和、最大后缀和、最大子段和,以及翻转和覆盖的懒标记。插入和删除操作需要考虑块的分裂和合并,这可能比较复杂,因为频繁的插入删除会导致块的大小不均,影响效率。所以可能需要设置块的大小阈值,比如当块的大小超过2√n时分裂,小于√n/2时合并相邻块。 处理翻转操作时,每个块维护一个翻转标记,当需要翻转区间时,对覆盖的完整块标记翻转,并处理部分块。同样,覆盖操作需要懒标记,当块被完全覆盖时,直接更新块内的值,并记录覆盖值。 最大子段和的计算需要每个块维护内部的最大子段和、最大前缀和、最大后缀和,这样在查询时,可以将多个块的信息合并起来得到整体的最大子段和。这可能比较复杂,需要考虑块之间的前后缀如何组合。 插入和删除操作需要找到对应的位置所在的块,如果插入导致块过大,就分裂成两个块。删除时如果块变得过小,可能需要合并相邻块。这些操作需要维护块之间的链表结构,方便快速插入和删除块。 举个例子,当要在位置pos插入一段数列,首先找到pos所在的块,如果块的大小加上插入元素后超过阈值,就分裂该块为两个,然后将插入的元素作为新块插入到链表中。这样插入的时间复杂度是O(√n),因为分裂和插入块的时间与块的大小有关。 对于翻转和覆盖操作,应用懒标记是关键,这样可以延迟实际的操作,直到需要访问块的具体内容时才进行实际的处理。例如,当需要访问一个带有翻转标记的块时,先执行翻转操作,并清除标记。 不过分块在处理这些动态操作时,尤其是频繁的插入和删除,可能效率不如平衡树结构(如Splay或Treap),但分块实现起来可能相对简单一些。需要权衡实现复杂度和效率。 总结一下,分块实现的关键点包括: 1. 分块的结构设计,每个块维护必要的信息和懒标记。 2. 插入和删除时的块分裂与合并策略。 3. 懒标记的处理,如翻转和覆盖,何时下传。 4. 查询操作时如何合并各个块的信息,如最大子段和。 可能遇到的问题包括块的大小管理不当导致性能下降,懒标记处理错误导致数据不一致,以及在合并块信息时逻辑错误。需要详细设计每个操作的步骤,并处理各种边界情况,比如操作区间跨多个块,或者在块的开头或结尾的部分操作。 最后,参考用户提供的引用,尤其是引用[1]提到递归图的理解,可能分块的递归处理不太相关,但引用[2]提到洛谷题目,可能需要参考类似题解中的分块实现方法。不过用户提供的引用可能没有直接相关的内容,所以需要依靠已有的分块知识来构建解决方案。</think>### 分块方法实现洛谷 P2042 维护数列问题 #### 分块结构设计 1. **块内信息**: - 数据存储:每个块存储$size \leq 2\sqrt{n}$个元素 - 维护以下字段: ```text sum: 区间和 lmax: 最大前缀和 rmax: 最大后缀和 tmax: 最大子段和 rev: 翻转标记(0/1) cov: 覆盖标记(特殊值表示未覆盖) ``` 2. **分块逻辑**: - 块间通过链表或数组连接 - 插入/删除时动态调整块大小,触发分裂或合并(例如块大小超过$2\sqrt{n}$时分裂,相邻块总大小低于$\sqrt{n}$时合并) #### 核心操作实现 **1. 区间翻转(REVERSE)**: - 对完整覆盖的块:翻转标记`rev ^= 1`,交换`lmax`与`rmax` - 对部分覆盖的块:下传标记后暴力翻转元素 时间复杂度:$O(\sqrt{n})$ **2. 区间覆盖(MAKE-SAME)**: - 对完整覆盖的块:更新`cov`标记,直接计算`sum`,`lmax`,`rmax`,`tmax` - 对部分覆盖的块:下传标记后暴力修改 时间复杂度:$O(\sqrt{n})$ **3. 最大子段和(MAX-SUM)**: - 合并相邻块的`rmax`和`lmax`,遍历所有块维护全局最大值 时间复杂度:$O(\sqrt{n})$ **4. 插入(INSERT)**: - 定位插入位置所在块,若插入后块大小超过阈值则分裂 时间复杂度:$O(\sqrt{n} + k/\sqrt{n})$ **5. 删除(DELETE)**: - 移除目标区间涉及的所有块,合并相邻小块 时间复杂度:$O(\sqrt{n} + k/\sqrt{n})$ #### 代码框架示例(关键部分) ```python class Block: def __init__(self): self.data = [] self.sum = 0 self.lmax = self.rmax = self.tmax = -inf self.rev = 0 self.cov = None def push_down(self): # 下传覆盖/翻转标记到数据层 if self.cov is not None: self.data = [self.cov] * len(self.data) if self.rev: self.data.reverse() self.rev = 0 self.cov = None def update_info(self): # 重新计算sum/lmax/rmax/tmax pass class BlockList: def __init__(self): self.blocks = [] def split(self, idx): # 分裂过大的块 pass def merge(self): # 合并过小的相邻块 pass ``` #### 复杂度分析 | 操作类型 | 时间复杂度 | |----------------|---------------------| | 插入/删除 | $O(\sqrt{n} + k)$ | | 翻转/覆盖/求和 | $O(\sqrt{n})$ | | 最大子段和 | $O(\sqrt{n})$ | #### 注意事项 1. **标记下传策略**:在访问块内数据前必须下传所有标记 2. **块大小平衡**:通过动态分裂/合并保证$size \in [\sqrt{n}/2, 2\sqrt{n}]$ 3. **边界处理**:特别注意区间跨多个块时的部分覆盖情况
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值