HDU-1584 蜘蛛牌【dfs】
2017-11-14 21:37
211 查看
蜘蛛牌
[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<bits/stdc++.h> using namespace std; int ans,a[17],b[21],vis[12]; void dfs(int s,int k) { int c[11]; memset(c,0,sizeof(c)); if(s==9) { if(ans>k) ans=k; return ; } for(int i=1;i<=9;i++) { if(vis[i]==0) { vis[i]=1; int kk=k+abs(b[i]-b[i+1]); int t=b[i]; for(int j=1;j<=10;j++) 4000 { if(b[j]==t) { b[j]=b[i+1]; c[j]=t; } } dfs(s+1,kk); vis[i]=0; for(int j=1;j<10;j++) { if(c[j]==t) b[j]=t; } } } } int main() { int t; scanf("%d ",&t); while(t--) { for(int i=1;i<=10;i++) { scanf("%d",&a[i]); b[a[i]]=i; } ans=9999999; memset(vis,0,sizeof(vis)); dfs(0,0); printf("%d\n",ans); } return 0; }
相关文章推荐
- HDU-1584-蜘蛛牌(DFS)
- (step4.3.9)hdu 1584(蜘蛛牌——DFS)
- hdu 1584 蜘蛛牌(dfs)
- hdu 1584蜘蛛牌(DFS)
- hdu 1584 蜘蛛牌(DFS)
- hdu 1584 蜘蛛牌 dfs
- hdu1584 蜘蛛牌 --DFS & 区间DP
- hdu 1584 蜘蛛牌【dfs+简单剪枝】
- HDU 1584 蜘蛛牌(DFS)
- HDU——1584 蜘蛛牌(剪枝 + dfs)
- HDU 1584 蜘蛛牌(DFS)
- (step4.3.9)hdu 1584(蜘蛛牌——DFS)
- hdu 1584 蜘蛛牌(DFS)
- 蜘蛛牌(hdu 1584 DFS)
- HDU1584 蜘蛛牌 [DFS简单题]
- HDU 1584蜘蛛纸牌(DFS)
- HDU 1584 蜘蛛牌
- HDU 1584 蜘蛛牌【回溯】
- HDU 1584 蜘蛛牌
- hdu 1584 蜘蛛纸牌 搜索 分治 动态规划