本文主要是介绍蜘蛛牌 HDU 1584,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
Problem Description
蜘蛛牌是windows xp操作系统自带的一款纸牌游戏,游戏规则是这样的:只能将牌拖到比她大一的牌上面(A最小,K最大),如果拖动的牌上有按顺序排好的牌时,那么这些牌也跟着一起移动,游戏的目的是将所有的牌按同一花色从小到大排好,为了简单起见,我们的游戏只有同一花色的10张牌,从A到10,且随机的在一行上展开,编号从1到10,把第i号上的牌移到第j号牌上,移动距离为abs(i-j),现在你要做的是求出完成游戏的最小移动距离。
Input
第一个输入数据是T,表示数据的组数。
每组数据有一行,10个输入数据,数据的范围是[1,10],分别表示A到10,我们保证每组数据都是合法的。
Output
对应每组数据输出最小移动距离。
Sample Input
1 1 2 3 4 5 6 7 8 9 10
Sample Output
9
// dfs()枚举所有情况
//注意 num[] 数组 储存的是 数x的下标
//还要注意, for内循环 j = i+1 开始的
//实在不懂,在纸上 推演推演。
#include<stdio.h>
int vis[11],num[11];
int ans;
int abs( int x) {if(x >= 0)return x;return -x;
}
void dfs(int step,int re){if( re >= ans)return ; if(step==9){ans = re;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(step+1,re + abs( num[i] - num[j] ) );dfs(step+1,re) break; }}vis[i] = 0;}}
}
int main(void){int t,x;scanf("%d",&t);while(t--){ans = 99999;for(int i=1;i<=10;i++){ scanf("%d",&x);num[x] = i ;vis[i] = 0 ;}dfs(0,0);printf("%d\n",ans); }
}
这篇关于蜘蛛牌 HDU 1584的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!