【DFS】hdu 1584 蜘蛛牌

看代码:

#include <iostream>
#include <cstdio>
#include <fstream>

using namespace std;
const int INF=100000000;
const int MAXN=1000000;
int ans;
int pos[11];
bool vis[11];
int abs(int a,int b){
    if(a>b)return a-b;
    return b-a;
}
void dfs(int deep,int step){
    if(deep==9){
        if(step<ans)ans=step;
        return;
    }
    for(int i=1;i<10;i++){
        if(!vis[i]){
            vis[i]=1;
            for(int j = i+1;j<=10;j++)            {
                //如果vis[j]==0,那么j就已经移动到比j更大的牌上了

                if(!vis[j]){ //找到了i能移动到的位置。
                    int temp=step+abs(pos[i],pos[j]);
                    if(temp>ans)break;
                    dfs(deep+1,step+abs(pos[i],pos[j]));
                    break;
                }
            }
            vis[i]=0;
        }
    }
}
int main(){
    //freopen("in.txt","r",stdin);

    int t,n,m;
    scanf("%d",&t);
    while(t--){
        for(int i=1;i<=10;i++){
            int temp;
            scanf("%d",&temp);
            pos[temp]=i;
            vis[temp]=0;
        }
        ans=INF;
        dfs(0,0);
        printf("%d\n", ans);
    }
    return 0;
}
时间: 2024-11-05 20:40:26

【DFS】hdu 1584 蜘蛛牌的相关文章

HDU 1584(蜘蛛牌 DFS)

题意是在蜘蛛纸牌的背景下求 10 个数的最小移动距离. 在数组中存储 10 个数字各自的位置,用深搜回溯的方法求解. 代码如下: 1 #include <bits/stdc++.h> 2 using namespace std; 3 int ans,a[20]; 4 bool vis[20]; 5 void dfs(int num,int sum) 6 { 7 if(sum > ans) return; 8 if(num == 9) 9 { 10 ans = sum; 11 return

hdu 1584 蜘蛛牌

陷入了思维误区,以为要用数组下标来记录牌的位置,看了别人的代码才发现是要用数组的值来记录牌的位置,转过这道弯之后就是道水题了 #include<iostream> #include<cmath> #include<cstring> #define maxn 10+2 using namespace std; int mapp[maxn],visit[maxn]; int re; void dfs(int t,int sum) { if(t==9){re=min(re,s

hdu 1584 蜘蛛纸牌

题意:小牌叠在大牌上,问叠成一堆的最小移动距离 思路:将所有状况进行一次DFS #include<bits/stdc++.h>using namespace std;int a[11];int s;int vis[11];void dfs(int k,int ans){ if(ans>s)return ;//优化 if(k==10)//出口 { if(ans<s) s=ans; return; } for(int i=1;i<=9;i++)//对函数10个情况进行穷举 { i

hdu 1584 dfs+剪枝

蜘蛛牌 Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 3730    Accepted Submission(s): 1591 Problem Description 蜘蛛牌是windows xp操作系统自带的一款纸牌游戏,游戏规则是这样的:只能将牌拖到比她大一的牌上面(A最小,K最大),如果拖动的牌上有按顺序排好的牌时,那么这些牌也

HDU1584 蜘蛛牌 DFS 简单题

题意: 蜘蛛牌是windows xp操作系统自带的一款纸牌游戏,游戏规则是这样的:只能将牌拖到比她大一的牌上面(A最小,K最大),如果拖动的牌上有按顺序排好的牌时,那么这些牌也跟着一起移动,游戏的目的是将所有的牌按同一花色从小到大排好,为了简单起见,我们的游戏只有同一花色的10张牌,从A到10,且随机的在一行上展开,编号从1到10,把第i号上的牌移到第j号牌上,移动距离为abs(i-j),现在你要做的是求出完成游戏的最小移动距离. 输入: 第一个输入数据是T,表示数据的组数.每组数据有一行,10

蜘蛛牌

蜘蛛牌 Time Limit: 5000ms                                           Memory Limit: 32768KB 64-bit integer IO format:      Java class name: 蜘蛛牌是windows xp操作系统自带的一款纸牌游戏,游戏规则是这样的:只能将牌拖到比她大一的牌上面(A最小,K最大),如果拖动的牌上有按顺序排好的牌时,那么这些牌也跟着一起移动,游戏的目的是将所有的牌按同一花色从小到大排好,为

F - 蜘蛛牌

Problem Description 蜘蛛牌是windows xp操作系统自带的一款纸牌游戏,游戏规则是这样的:只能将牌拖到比她大一的牌上面(A最小,K最大),如果拖动的牌上有按顺序排好的牌时,那么这些牌也跟着一起移动,游戏的目的是将所有的牌按同一花色从小到大排好,为了简单起见,我们的游戏只有同一花色的10张牌,从A到10,且随机的在一行上展开,编号从1到10,把第i号上的牌移到第j号牌上,移动距离为abs(i-j),现在你要做的是求出完成游戏的最小移动距离. Input 第一个输入数据是T,

HDU1584(蜘蛛牌)

蜘蛛牌 Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 2880    Accepted Submission(s): 1230 Problem Description 蜘蛛牌是windows xp操作系统自带的一款纸牌游戏,游戏规则是这样的:只能将牌拖到比她大一的牌上面(A最小,K最大),如果拖动的牌上有按顺序排好的牌时,那么这些牌也

HDU 1584

/*蜘蛛牌是windows xp操作系统自带的一款纸牌游戏,游戏规则是这样的:只能将牌拖到比她大一的牌上面(A最小,K最大),如果拖动的牌上有按顺序排好的牌时,那么这些牌也跟着一起移动,游戏的目的是将所有的牌按同一花色从小到大排好,为了简单起见,我们的游戏只有同一花色的10张牌,从A到10,且随机的在一行上展开,编号从1到10,把第i号上的牌移到第j号牌上,移动距离为abs(i-j),现在你要做的是求出完成游戏的最小移动距离. Input 第一个输入数据是T,表示数据的组数. 每组数据有一行,1