标签:
#include <stdio.h>
#include <iostream>
using namespace std;
int abs(int a)
{
return a > 0 ? a : (-a);
}
int vis[11], p[11], bs, step;
void dfs(int t)
{
if(t == 10)
{
bs = step; // bs存放临时的最值
return;
}
int i, j;
for(i = 1; i < 11; ++i)//i代编牌的面值
{
if(!vis[i])//如果这张牌没被挪动
{
for(j = i+1; j < 11; ++j)//找到离第一张牌最近的面值最小的一摞牌
if(!vis[j])
{
step += abs(p[i] - p[j]);
if(step < bs)
{
vis[i] = 1;
dfs(t+1);
vis[i] = 0;
}
step -= abs(p[i] - p[j]);
break;
}
}
}
}
int main()
{
int t, a;
scanf("%d", &t);
while(t--)
{
for(int i = 1; i < 11; ++i)
{
scanf("%d", &a);
p[a] = i;//p数组存放面值为a的牌的位置序号
vis[i] = 0;//所有牌都没有被移动
}
bs = 10000; //把所需移动的步伐数初始为最大
step = 0;
dfs(1);
printf("%d\n", bs);
}
}
标签:
原文地址:http://www.cnblogs.com/rain-1/p/4758624.html