好的,万众瞩目的题解来了。
T1.水叮当的舞步
20分,我的迭代加深QAQ。
100分,我的迭代加深加一个剪枝
这里就是一个矩阵,每个矩阵中有0到5六种颜色比如
我们可以发现,每次寻找左上角的格子所在的联通块耗费的时间常数巨大。因此我们在这里寻求突破。
我们引入一个N*N的v数组。左上角的格子所在的联通块里的格子标记为1。左上角联通块周围一圈格子标记为2,其它格子标记为0。如果某次选择了颜色c,我们只需要找出标记为2并且颜色为c的格子,向四周扩展,并相应地修改v标记,就可以不断扩大标记为1的区域,最终如果所有格子标记都是1,那么显然找到了答案。
接下来,代码
#include<iostream>
#include<cstdio>
#include<iomanip>
#include<map>
#include<queue>
#include<vector>
#include<algorithm>
#include<cstring>
#define int long long
using namespace std;
inline int read()
{
int x=0,f=1;
char c=getchar();
while(!isdigit(c))
{
if(c=='-')
{
f=-1;
}
c=getchar();
}
while(isdigit(c))
{
x=x*10+c-'0';
c=getchar();
}
return x*f;
}
int s,n,mp[9][9],mark[9][9];
int xa[4]={1,-1,0,0},ya[4]={0,0,-1,1},used[6];
bool ans;
inline int numa()
{
int t=0;
memset(used,0,sizeof(used));
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
{
if(!used[mp[i][j]]&&mark[i][j]!=1)
{
used[mp[i][j]]=1;
t++;
}
}
}
return t;
}
void dfs(int a,int