蜘蛛牌
原题链接https://vjudge.net/contest/345248#problem/H
dfs遍历 寻找最小值
#include<cstring>
#include<cstdio>
#include<cmath>
#include<cstdlib>
#include<iostream>
#include<algorithm>
#include<queue>
#include<stack>
using namespace std;
long long a[15];//数组
long long vis[15];//标号
long long sum;//记录最小值
void dfs(long long num,long long step)
{
long long i,j;
if(num>=sum)//剪枝
{
return ;
}
if(step==9)//排完之后跳出
{
sum=num;
return ;
}
for(i=1; i<10; i++)//选取第一个数
{
if(vis[i]==0)//如果没被标记
{
vis[i]=1;//标记开始遍历
for(j=i+1; j<=10; j++)//找i+1,也就是i要放的位置,如果i+1已经放过,那就一定放在i+1的下一位,i也要放在i+2上,所以往下遍历找最近的没有被标记的数
{
if(vis[j]==0)
{
dfs(num+abs(a[i]-a[j]),step+1);//dfs下一轮
break;
}
}
vis[i]=0;//取标
}
}
}
int main()
{
long long t;
scanf("%lld",&t);
while(t--)
{
memset(vis,0,sizeof(vis));
memset(a,0,sizeof(a));
sum=778321906;
long long x,i;
for(i=1; i<=10; i++)//读取
{
scanf("%lld",&x);
a[x]=i;
}
dfs(0,0);//深搜
printf("%lld\n",sum);//输出
}
return 0;
}