分析:
没什么可说的,bfs
方便起见,我们需要把矩阵转化成一个数,代码中我使用的是康托展开
康托展开的公式:
X=an∗(n−1)!+an−1∗(n−2)!+...+ai∗(i−1)!+..+a2∗1!+a1∗0!
X
=
a
n
∗
(
n
−
1
)
!
+
a
n
−
1
∗
(
n
−
2
)
!
+
.
.
.
+
a
i
∗
(
i
−
1
)
!
+
.
.
+
a
2
∗
1
!
+
a
1
∗
0
!
其中,
ai
a
i
在当前未出现的元素中排第几(从0开始)
举个例子:
s=DBAC
s
=
D
B
A
C
a4=′D′
a
4
=
′
D
′
这个元素在数组
[′D′,′B′,′A′,′C′]
[
′
D
′
,
′
B
′
,
′
A
′
,
′
C
′
]
中是第几大的元素
′A′
′
A
′
是第0大的元素,
′B′
′
B
′
是第1大的元素,
′C′
′
C
′
是第2大的元素,
′D′
′
D
′
是第3大的元素,所以
a4=3
a
4
=
3
我们删除
′D′
′
D
′
,继续↓
a3=′B′
a
3
=
′
B
′
这个元素在数组
[′B′,′A′,′C′]
[
′
B
′
,
′
A
′
,
′
C
′
]
中是第几大的元素
′A′
′
A
′
是第0大的元素,
′B′
′
B
′
是第1大的元素,
′C′
′
C
′
是第2大的元素,所以
a3=1
a
3
=
1
我们删除
′B′
′
B
′
,继续↓
a2=′A′
a
2
=
′
A
′
这个元素在数组
[′A′,′C′]
[
′
A
′
,
′
C
′
]
中是第几大的元素
′A′
′
A
′
是第0大的元素,
′C′
′
C
′
是第1大的元素,所以
a2=0
a
2
=
0
我们删除
′A′
′
A
′
,继续↓
a1=′C′
a
1
=
′
C
′
这个元素在数组
[′C′]
[
′
C
′
]
中是第几大的元素
′C′
′
C
′
是第0大的元素,所以
a1=0
a
1
=
0
(因为子数组只有1个元素,所以
a1
a
1
总是为0)
所以, X(s)=3∗3!+1∗2!+0∗1!+0∗0!=20 X ( s ) = 3 ∗ 3 ! + 1 ∗ 2 ! + 0 ∗ 1 ! + 0 ∗ 0 ! = 20
这道题中的数组比较小,我们直接暴力计算康托展开值即可
tip
平生最长代码
胆大心细
特此纪念
#include<cstdio> //广搜+康托展开
#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
const int jc[9]={1,1,2,6,24,120,720,5040,40320};
char chu[10];
int num[362881][10],tou,wei;
int da[9]={1,2,3,8,0,4,7,6,5};
bool p[362881];
int deep[362881];
int cl(int bh)
{
int i,j;
int ans,sum=0;
for (i=0;i<=8;i++)
{
ans=0;
for (j=i+1;j<=8;j++)
if (num[bh][j]<num[bh][i])
ans++;
sum+=ans*jc[8-i];
}
return sum;
}
bool pd(int bh)
{
int i;
for (i=0;i<=8;i++)
if (num[bh][i]!=da[i])
return 0;
return 1;
}
int ss()
{
int i,j,hh,r;
tou=-1;
wei=1;
do
{
tou++;
hh=wei+1;
for (i=0;i<=8;i++)
num[hh][i]=num[tou][i];
for (i=0;i<=8;i++)
if (num[tou][i]==0)
{
j=i;
break;
}
if (j==0) //分情况 // 0 1 2
{ // 3 4 5
swap(num[hh][0],num[hh][1]); // 6 7 8
r=cl(hh);
if (p[r]==1)
{
p[r]=0;
wei++;
deep[wei]=deep[tou]+1;
if (pd(wei)==1)
{
printf("%d",deep[wei]);
return 0;
}
hh++;
for (i=0;i<=8;i++)
num[hh][i]=num[tou][i];
}
else
swap(num[hh][0],num[hh][1]);
swap(num[hh][0],num[hh][3]);
r=cl(hh);
if (p[r]==1)
{
p[r]=0;
wei++;
deep[wei]=deep[tou]+1;
if (pd(wei)==1)
{
printf("%d",deep[wei]);
return 0;
}
hh++;
for (i=0;i<=8;i++)
num[hh][i]=num[tou][i];
}
else
swap(num[hh][0],num[hh][3]);
}
else
if (j==2)
{
swap(num[hh][1],num[hh][2]);
r=cl(hh);
if (p[r]==1)
{
p[r]=0;
wei++;
deep[wei]=deep[tou]+1;
if (pd(wei)==1)
{
printf("%d",deep[wei]);
return 0;
}
hh++;
for (i=0;i<=8;i++)
num[hh][i]=num[tou][i];
}
else
swap(num[hh][1],num[hh][2]);
swap(num[hh][2],num[hh][5]);
r=cl(hh);
if (p[r]==1)
{
p[r]=0;
wei++;
deep[wei]=deep[tou]+1;
if (pd(wei)==1)
{
printf("%d",deep[wei]);
return 0;
}
hh++;
for (i=0;i<=8;i++)
num[hh][i]=num[tou][i];
}
else
swap(num[hh][2],num[hh][5]);
}
if (j==6)
{
swap(num[hh][6],num[hh][3]);
r=cl(hh);
if (p[r]==1)
{
p[r]=0;
wei++;
deep[wei]=deep[tou]+1;
if (pd(wei)==1)
{
printf("%d",deep[wei]);
return 0;
}
hh++;
for (i=0;i<=8;i++)
num[hh][i]=num[tou][i];
}
else
swap(num[hh][6],num[hh][3]);
swap(num[hh][6],num[hh][7]);
r=cl(hh);
if (p[r]==1)
{
p[r]=0;
wei++;
deep[wei]=deep[tou]+1;
if (pd(wei)==1)
{
printf("%d",deep[wei]);
return 0;
}
hh++;
for (i=0;i<=8;i++)
num[hh][i]=num[tou][i];
}
else
swap(num[hh][6],num[hh][7]);
}
if (j==8)
{
swap(num[hh][8],num[hh][7]);
r=cl(hh);
if (p[r]==1)
{
p[r]=0;
wei++;
deep[wei]=deep[tou]+1;
if (pd(wei)==1)
{
printf("%d",deep[wei]);
return 0;
}
hh++;
for (i=0;i<=8;i++)
num[hh][i]=num[tou][i];
}
else
swap(num[hh][8],num[hh][7]);
swap(num[hh][8],num[hh][5]);
r=cl(hh);
if (p[r]==1)
{
p[r]=0;
wei++;
deep[wei]=deep[tou]+1;
if (pd(wei)==1)
{
printf("%d",deep[wei]);
return 0;
}
hh++;
for (i=0;i<=8;i++)
num[hh][i]=num[tou][i];
}
else
swap(num[hh][8],num[hh][5]);
}
if (j==1)
{
swap(num[hh][1],num[hh][0]);
r=cl(hh);
if (p[r]==1)
{
p[r]=0;
wei++;
deep[wei]=deep[tou]+1;
if (pd(wei)==1)
{
printf("%d",deep[wei]);
return 0;
}
hh++;
for (i=0;i<=8;i++)
num[hh][i]=num[tou][i];
}
else
swap(num[hh][1],num[hh][0]);
swap(num[hh][1],num[hh][2]);
r=cl(hh);
if (p[r]==1)
{
p[r]=0;
wei++;
deep[wei]=deep[tou]+1;
if (pd(wei)==1)
{
printf("%d",deep[wei]);
return 0;
}
hh++;
for (i=0;i<=8;i++)
num[hh][i]=num[tou][i];
}
else
swap(num[hh][1],num[hh][2]);
swap(num[hh][1],num[hh][4]);
r=cl(hh);
if (p[r]==1)
{
p[r]=0;
wei++;
deep[wei]=deep[tou]+1;
if (pd(wei)==1)
{
printf("%d",deep[wei]);
return 0;
}
hh++;
for (i=0;i<=8;i++)
num[hh][i]=num[tou][i];
}
else
swap(num[hh][1],num[hh][4]);
}
if (j==3)
{
swap(num[hh][3],num[hh][0]);
r=cl(hh);
if (p[r]==1)
{
p[r]=0;
wei++;
deep[wei]=deep[tou]+1;
if (pd(wei)==1)
{
printf("%d",deep[wei]);
return 0;
}
hh++;
for (i=0;i<=8;i++)
num[hh][i]=num[tou][i];
}
else
swap(num[hh][3],num[hh][0]);
swap(num[hh][3],num[hh][4]);
r=cl(hh);
if (p[r]==1)
{
p[r]=0;
wei++;
deep[wei]=deep[tou]+1;
if (pd(wei)==1)
{
printf("%d",deep[wei]);
return 0;
}
hh++;
for (i=0;i<=8;i++)
num[hh][i]=num[tou][i];
}
else
swap(num[hh][3],num[hh][4]);
swap(num[hh][3],num[hh][6]);
r=cl(hh);
if (p[r]==1)
{
p[r]=0;
wei++;
deep[wei]=deep[tou]+1;
if (pd(wei)==1)
{
printf("%d",deep[wei]);
return 0;
}
hh++;
for (i=0;i<=8;i++)
num[hh][i]=num[tou][i];
}
else
swap(num[hh][3],num[hh][6]);
}
if (j==5)
{
swap(num[hh][5],num[hh][2]);
r=cl(hh);
if (p[r]==1)
{
p[r]=0;
wei++;
deep[wei]=deep[tou]+1;
if (pd(wei)==1)
{
printf("%d",deep[wei]);
return 0;
}
hh++;
for (i=0;i<=8;i++)
num[hh][i]=num[tou][i];
}
else
swap(num[hh][5],num[hh][2]);
swap(num[hh][5],num[hh][4]);
r=cl(hh);
if (p[r]==1)
{
p[r]=0;
wei++;
deep[wei]=deep[tou]+1;
if (pd(wei)==1)
{
printf("%d",deep[wei]);
return 0;
}
hh++;
for (i=0;i<=8;i++)
num[hh][i]=num[tou][i];
}
else
swap(num[hh][5],num[hh][4]);
swap(num[hh][5],num[hh][8]);
r=cl(hh);
if (p[r]==1)
{
p[r]=0;
wei++;
deep[wei]=deep[tou]+1;
if (pd(wei)==1)
{
printf("%d",deep[wei]);
return 0;
}
hh++;
for (i=0;i<=8;i++)
num[hh][i]=num[tou][i];
}
else
swap(num[hh][5],num[hh][8]);
}
if (j==7)
{
swap(num[hh][7],num[hh][6]);
r=cl(hh);
if (p[r]==1)
{
p[r]=0;
wei++;
deep[wei]=deep[tou]+1;
if (pd(wei)==1)
{
printf("%d",deep[wei]);
return 0;
}
hh++;
for (i=0;i<=8;i++)
num[hh][i]=num[tou][i];
}
else
swap(num[hh][7],num[hh][6]);
swap(num[hh][7],num[hh][4]);
r=cl(hh);
if (p[r]==1)
{
p[r]=0;
wei++;
deep[wei]=deep[tou]+1;
if (pd(wei)==1)
{
printf("%d",deep[wei]);
return 0;
}
hh++;
for (i=0;i<=8;i++)
num[hh][i]=num[tou][i];
}
else
swap(num[hh][7],num[hh][4]);
swap(num[hh][7],num[hh][8]);
r=cl(hh);
if (p[r]==1)
{
p[r]=0;
wei++;
deep[wei]=deep[tou]+1;
if (pd(wei)==1)
{
printf("%d",deep[wei]);
return 0;
}
hh++;
for (i=0;i<=8;i++)
num[hh][i]=num[tou][i];
}
else
swap(num[hh][7],num[hh][8]);
}
if (j==4)
{
swap(num[hh][4],num[hh][1]);
r=cl(hh);
if (p[r]==1)
{
p[r]=0;
wei++;
deep[wei]=deep[tou]+1;
if (pd(wei)==1)
{
printf("%d",deep[wei]);
return 0;
}
hh++;
for (i=0;i<=8;i++)
num[hh][i]=num[tou][i];
}
else
swap(num[hh][4],num[hh][1]);
swap(num[hh][4],num[hh][3]);
r=cl(hh);
if (p[r]==1)
{
p[r]=0;
wei++;
deep[wei]=deep[tou]+1;
if (pd(wei)==1)
{
printf("%d",deep[wei]);
return 0;
}
hh++;
for (i=0;i<=8;i++)
num[hh][i]=num[tou][i];
}
else
swap(num[hh][3],num[hh][4]);
swap(num[hh][4],num[hh][5]);
r=cl(hh);
if (p[r]==1)
{
p[r]=0;
wei++;
deep[wei]=deep[tou]+1;
if (pd(wei)==1)
{
printf("%d",deep[wei]);
return 0;
}
hh++;
for (i=0;i<=8;i++)
num[hh][i]=num[tou][i];
}
else
swap(num[hh][4],num[hh][5]);
swap(num[hh][4],num[hh][7]);
r=cl(hh);
if (p[r]==1)
{
p[r]=0;
wei++;
deep[wei]=deep[tou]+1;
if (pd(wei)==1)
{
printf("%d",deep[wei]);
return 0;
}
hh++;
for (i=0;i<=8;i++)
num[hh][i]=num[tou][i];
}
else
swap(num[hh][4],num[hh][7]);
}
}
while (tou<wei);
return 0;
}
int main()
{
memset(p,1,sizeof(p));
cin>>chu;
for (int i=0;i<=8;i++)
num[0][i]=chu[i]-'0';
p[cl(0)]=0;
deep[0]=0;
if (pd(0)==1)
printf("0");
else
ss();
return 0;
}