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;
12     }
13     for(int i = 1; i <= 10; ++i)
14     {
15         if(!vis[i])
16         {
17             vis[i] = 1;
18             for(int j = i+1; j <= 10; ++j)
19             {
20                 if(!vis[j])
21                 {
22                     dfs(num+1,sum+abs(a[i]-a[j]));
23                     break;
24                 }
25             }
26             vis[i] = 0;
27         }
28     }
29 }
30 int main()
31 {
32     int t,tmp;
33     scanf("%d",&t);
34     while(t--)
35     {
36         for(int i = 1; i <= 10; ++i)
37         {
38             scanf("%d",&tmp);
39             a[tmp] = i;
40         }
41         memset(vis,0,sizeof(vis));
42         ans = 1000000;
43         dfs(0,0);
44         printf("%d\n",ans);
45     }
46     return 0;
47 }

向这些博客的作者表示感谢:

https://blog.csdn.net/flynn_curry/article/details/50775604

https://www.cnblogs.com/yanqi110/articles/4928285.html

原文地址:https://www.cnblogs.com/Taskr212/p/9614126.html

时间: 2024-08-02 13:20:16

HDU 1584(蜘蛛牌 DFS)的相关文章

【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(in

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

HDU1584 蜘蛛牌 DFS 简单题

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

蜘蛛牌 (DFS)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1584 全部状态都判断一遍 代码: 1 #include <stdio.h> 2 #include <string.h> 3 #include <math.h> 4 #include <algorithm> 5 #include <iostream> 6 #include <ctype.h> 7 #include <iomanip&g

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最大),如果拖动的牌上有按顺序排好的牌时,那么这些牌也

蜘蛛牌

蜘蛛牌 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最大),如果拖动的牌上有按顺序排好的牌时,那么这些牌也