HDU-1584-蜘蛛牌

HDU-1584-蜘蛛牌

题目链接:HDU-1584

题目大意:小的牌移动到大的牌上面。给出每个牌的位置,问叠成一堆牌的最小移动距离

题目思路:DFS+剪枝

以下是代码:

#include <vector>
#include <map>
#include <set>
#include <algorithm>
#include <iostream>
#include <cstdio>
#include <cmath>
#include <cstdlib>
#include <string>
#include <cstring>
using namespace std;
int p[20];
int vis[20];
int ans = 9999999;
void dfs(int cur,int sum)  //cur表示解决了几张牌,sum表示目前移动的距离
{
    if (sum >= ans) return;  //剪枝
    if (cur == 9)  //10是保持不动
    {
        ans = sum;
        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(cur + 1,sum + abs(p[i] - p[j]));  //小的牌叠到大的牌上面
                    break; //注意不要再这个地方回溯 如果回溯了 就像是又一个全排列 而且牌得移动不合理,比如2移到6了,结果回溯就直接跳过3~6到了7的下面
                }
            }
            vis[i] = 0;   //这里回溯
        }       
    }
}
int main(){
    int t;
    scanf("%d",&t);
    while(t--)
    {
        memset(vis,0,sizeof(vis));
        ans = 9999999;
        for (int i = 1; i <= 10; i++)
        {
            int num;
            scanf("%d",&num);
            p[num] = i; //牌面为num在第i个位置 
        }
        dfs(0,0);
        printf("%d\n",ans);
    }
    return 0;
}

你可能感兴趣的:(DFS,HDU,1584)