蜘蛛牌 (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>
 8 #include <queue>
 9 #include <stdlib.h>
10 using namespace std;
11
12 int ans;
13 int tep[11],vis[11];
14
15 int abs(int x)
16 {
17     if(x>=0)
18         return x;
19     return -x;
20 }
21
22 void dfs(int cnt,int sum)
23 {
24     if(sum >= ans)
25         return ;
26     if(cnt==9){
27         ans=sum;
28         return ;
29     }
30     for(int i=1; i<10; i++){
31         if(!vis[i]){
32             vis[i]=1;
33             for(int j=i+1; j<=10; j++){
34                 if(!vis[j]){
35                     dfs(cnt+1,sum+abs(tep[i]-tep[j]));
36                     break;
37                 }
38             }
39             vis[i]=0;
40         }
41     }
42 }
43
44 int main()
45 {
46     int t,x;
47     scanf("%d",&t);
48     while(t--){
49         for(int i=1; i<=10; i++){
50             scanf("%d",&x);
51             tep[x]=i;
52         }
53         memset(vis,0,sizeof(vis));
54         ans=10000000;
55         dfs(0,0);
56         printf("%d\n",ans);
57     }
58 }
时间: 2024-10-12 05:30:59

蜘蛛牌 (DFS)的相关文章

HDU1584 蜘蛛牌 DFS 简单题

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

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

蜘蛛牌

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

ACM学习历程—HDU1584 蜘蛛牌(动态规划 &amp;&amp; 状态压缩)

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

【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

蜘蛛牌------和 上一个 戒指 差不多

.....然而 还是  不会  , 看别人的程序看了半天   自己 也是仅仅能模仿一下 ,   不懂到底是咋回事////////还是要看的  先附上  题目和代码 1 #include<stdio.h> 2 #include<math.h> 3 #include<algorithm> 4 using namespace std; 5 int vis[11],p[11],bs,step; 6 void DFS(int t) // 寻找 第一个 需要移动的 卡片 7 { 8

hdoj1584 蜘蛛牌 (区间型动态规划)

hdoj1584 分析: f[i][j] 表示 把一串牌 牌 i 到 j 摞为一摞时 所花费最少的步数. d[i][j] 表示把牌 i 挪到牌 j 上时需要走的步数(最初给的状态). 以一串牌 3~8 为例, 我们需要把牌 3 放到牌 4 上 , 而在最优的移动方案下, 牌 4 的位置不确定, 所以我们枚举牌 4 所在的位置(因为一共10张牌, 枚举是可以的) . 得出状态转移方程 : f[3][8] = min(f[3][8], f[4][k] + f[k][8] + d[3][k]); (