HDU 1584蜘蛛纸牌(DFS)
2018-02-04 17:32
435 查看
蜘蛛牌
Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 4818 Accepted Submission(s): 2052
[align=left]Problem Description[/align]
蜘蛛牌是windows xp操作系统自带的一款纸牌游戏,游戏规则是这样的:只能将牌拖到比她大一的牌上面(A最小,K最大),如果拖动的牌上有按顺序排好的牌时,那么这些牌也跟着一起移动,游戏的目的是将所有的牌按同一花色从小到大排好,为了简单起见,我们的游戏只有同一花色的10张牌,从A到10,且随机的在一行上展开,编号从1到10,把第i号上的牌移到第j号牌上,移动距离为abs(i-j),现在你要做的是求出完成游戏的最小移动距离。
[align=left]Input[/align]
第一个输入数据是T,表示数据的组数。
每组数据有一行,10个输入数据,数据的范围是[1,10],分别表示A到10,我们保证每组数据都是合法的。
[align=left]Output[/align]
对应每组数据输出最小移动距离。
[align=left]Sample Input[/align]
1
1 2 3 4 5 6 7 8 9 10
[align=left]Sample Output[/align]
9
遍历所有的情况即可,需要进行减支,即当前所遍历的情况的步数已经大于之前所完成的最小的步数,那当前的遍历则毫无意义,可以跳过
这道题的储存也需要注意,因为既要储存他的所处的位置,又要需要记录他的值,所以数组的下标作为他的值,数组的值作为他的位置即可
#include <stdio.h> #include <string.h> #include <math.h> #define Max 999999 #include <algorithm> using namespace std; int visit[20]; int map[20]; int ans; void dfs(int cnt,int sum) { if(sum>ans) { return ; } if(cnt==9) { ans=sum; } int i,j; for(i=1;i<10;i++) { if(visit[i]==0) { visit[i]=1; for(j=i+1;j<=10;j++) { if(visit[j]==0) { dfs(cnt+1,sum+abs(map[i]-map[j])); break; } } visit[i]=0; } } } int main(int argc, char *argv[]) { int t; scanf("%d",&t); while(t--) { int a,i; for(i=1;i<=10;i++) { scanf("%d",&a); map 4000 [a]=i; } ans=999999; memset(visit,0,sizeof(visit)); dfs(0,0); printf("%d\n",ans); } return 0; }
相关文章推荐
- (step4.3.9)hdu 1584(蜘蛛牌——DFS)
- hdu 1584 蜘蛛牌 dfs
- HDU1584 蜘蛛牌 [DFS简单题]
- HDU-1584-蜘蛛牌(DFS)
- HDU 1584 蜘蛛牌(DFS)
- hdu 1584 蜘蛛纸牌 搜索 分治 动态规划
- hdu 1584蜘蛛牌(DFS)
- HDU 1584 蜘蛛牌(DFS)
- hdu 1584 蜘蛛牌(DFS)
- (step4.3.9)hdu 1584(蜘蛛牌——DFS)
- HDU-1584 蜘蛛牌【dfs】
- hdu 1584 蜘蛛牌(dfs)
- hdu 1584 蜘蛛牌【dfs+简单剪枝】
- HDU——1584 蜘蛛牌(剪枝 + dfs)
- hdu 1584 蜘蛛牌(DFS)
- 蜘蛛牌(hdu 1584 DFS)
- hdu1584 蜘蛛牌 --DFS & 区间DP
- HDU 1584 蜘蛛牌
- hdu http://acm.hdu.edu.cn/showproblem.php?pid=1584 蜘蛛牌
- HDU 1548蜘蛛牌(DFS 深搜)