深搜题,详细见注释。
#include <iostream>
#include <cstring>
using namespace std;
const int MAXN = 15;
const int INF = 0x3f3f3f3f;
int minDis; //最小移动距离
int pos[MAXN]; //各数字所在的位置
bool vis[MAXN]; //各数字是否移动过
//深搜,count:已经移动的数字的个数,sum:当前移动距离
void DFS(int count, int sum)
{
if (count == 9) //排序完成
{
if (sum < minDis)
{
minDis = sum;
}
return;
}
else if (sum >= minDis) //剪枝
{
return;
}
else
{
for (int i = 1; i < 10; i++)
{
if (!vis[i])
{
vis[i] = true; //移动i
for (int j = i + 1; j <= 10; j++) //找到i+1的当前位置
{
if (!vis[j])
{
DFS(count + 1, sum + abs(pos[j] - pos[i]));
break;
}
}
vis[i] = false;
}
}
}
}
int main()
{
int T;
cin >> T;
while (T--)
{
memset(vis, 0, sizeof(vis));
for (int i = 1; i <= 10; i++)
{
int temp;
cin >> temp;
pos[temp] = i;
}
minDis = INF;
DFS(0, 0);
cout << minDis << endl;
}
return 0;
}
继续加油。