拍了两千多个点没拍出来RE的情况
#include<bits/stdc++.h>
#define int long long
#define endl '\n'
//#define debug
using namespace std;
inline int read()
{
char c=getchar();
int f=1,x=0;
while (c<'0'||c>'9'){if (c=='-')f=-1;c=getchar();}
while (c>='0'&&c<='9'){x=x*10+c-'0';c=getchar();}
return f*x;
}
inline void write(int x){
if (x<0){putchar('-');write(-x);return;}
if (x>=10)write(x/10);
putchar(x%10+'0');
}
bool st;
struct node{
int mp[4][4];
int emp[2][2];
bool check()
{
for (int i=0;i<=3;i++)
{
for (int j=1;j<=3;j++)
{
if (mp[i][j]!=mp[i][0])break;
if (j==3)return 1;
}
}
for (int i=0;i<=3;i++)
{
for (int j=1;j<=3;j++)
{
if (mp[j][i]!=mp[0][i])break;
if (j==3)return 1;
}
}
for (int i=1;i<=3;i++)
{
if (mp[i][i]!=mp[0][0])break;
if (i==3)return 1;
}
for (int i=1;i<=3;i++)
{
if (mp[i][3-i]!=mp[0][3])break;
if (i==3)return 1;
}
return 0;
}
void find_empty()
{
int cnt=0;
for (int i=0;i<=3;i++)
{
for (int j=0;j<=3;j++)
{
if (!mp[i][j])
{
emp[cnt][0]=i;
emp[cnt][1]=j;
cnt++;
}
}
}
}
}beg;
int dictx[4]={0,0,1,-1},dicty[4]={1,-1,0,0};
bool ed;
bool dfs(node x,int now,int dep,int purpose_dep)
{
if (dep==purpose_dep)
{
if (x.check())return 1;
return 0;
}
x.find_empty();
for (int kkk=0;kkk<=1;kkk++)
{
for (int op=0;op<=3;op++)
{
int dx=x.emp[kkk][0]+dictx[op],dy=x.emp[kkk][1]+dicty[op];
if (dx<0||dx>3||dy<0||dy>3)continue;
if (x.mp[dx][dy]==now)
{
swap(x.mp[dx][dy],x.mp[x.emp[kkk][0]][x.emp[kkk][1]]);
if (dfs(x,now^3,dep+1,purpose_dep))return 1;
swap(x.mp[dx][dy],x.mp[x.emp[kkk][0]][x.emp[kkk][1]]);
}
}
}
return 0;
}
signed main()
{
//freopen("data.in","r",stdin);
//freopen("data.out","w",stdout);
cerr<<"using "<<(&ed-&st)/1024.0/1024.0<<" Mb(s)"<<endl;
for (int i=0;i<=3;i++)
{
for (int j=0;j<=3;j++)
{
char c=getchar();
if (c=='B')beg.mp[i][j]=1;
if (c=='W')beg.mp[i][j]=2;
}
getchar();
}
int dep=0;
for (int i=1;i<=1145141919;i++)
{
if (dfs(beg,1,0,dep))
{
cout<<dep;
return 0;
}
if (dfs(beg,2,0,dep))
{
cout<<dep;
return 0;
}
dep++;
}
return 0;
}