奇葩做法:位压缩+bfs 居然过了 正解应该是dfs+剪枝吧
#include<stdio.h>
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<queue>
#include<math.h>
using namespace std;
int posi[10],to[10],mini[10];
struct node{
int pos,va,step;
node(){}
}st;
int mi=99999999;
int find(int pos,int reg)
{
int res=to[reg];
while((pos&(1<<res))==0)
{
res=to[res];
}
return res;
}
void bfs()
{
queue<node>q;
q.push(st);
node k,kk;
while(!q.empty())
{
k=q.front();
q.pop();
if(k.step==9)
{
mi=min(mi,k.va);
continue;
}
for(int i=0;i<10;++i)
if(k.pos&(1<<i))
{
if(posi[i]==10)continue;
int res=find(k.pos,i);
if(k.pos&(1<<res)){
kk.pos=k.pos-(1<<i);
kk.step=k.step+1;
kk.va=k.va+abs(i-res);
q.push(kk);
}
}
}
}
int main()
{
int t;
scanf("%d",&t);
while(t--)
{
memset(to,0,sizeof to);
for(int i=0;i<10;++i){scanf("%d",&posi[i]);mini[i]=8888888;}
for(int i=0;i<10;++i)
for(int j=0;j<10;++j)
if(posi[i]==(posi[j]-1)){
to[i]=j;
}
mi=9999999;
st.va=st.step=0;
st.pos=(1<<10)-1;
bfs();
printf("%d\n",mi);
}
return 0;
}