文章目录
  1. 1. 题意
  2. 2. 分析

原题

题意

蜘蛛纸牌,同一花色的10张牌,随机地排列在一行上展开,整理成从小到大有序的一列,求最小移动距离。

分析

首先,对于所有的数反映射,记录其位置,然后,DFS出所有可能性(用全排列的思想),对于每一次移动,进行决策,使其移动到只比他大1的纸牌上(这个纸牌很可能已经移动,故追踪至未被移动过的根纸牌),决策完十次后,进行判断,每次取最小。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
/*
T1:dfs中j的循环没有break出去。
*/

#include <bits/stdc++.h>
#define MAX 0x3f3f3f3f
using namespace std;
int ans;
int vis[13],a[13];
void dfs(int cnt,int sum){
if(sum>ans){
return;
}
if(cnt==10){
ans=sum;
//printf("%d ",ans);
return;
}
for(int i=1;i<=10;i++){//每个点都可能开始,这样可以做出所有的可能性(全排列思想)
if(!vis[i]){
vis[i]=1;
for(int j=i+1;j<=10;j++){
if(!vis[j]){
dfs(cnt+1,sum+fabs(a[i]-a[j]));
break;
}
}
vis[i]=0;//回溯
}
}
}
int main()
{

int t,x;
scanf("%d",&t);
while(t--){
for(int i=1;i<=10;i++){
scanf("%d",&x);
a[x]=i;
}
memset(vis,0,sizeof(vis));
ans=MAX;
dfs(1,0);
printf("%d\n",ans);
}
return 0;
}
文章目录
  1. 1. 题意
  2. 2. 分析