蜘蛛牌
Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 4013 Accepted Submission(s): 1723
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
Author
xhd
Source
冬练三九之二
Recommend
lcy
题意 :给10张牌(从1到10)在不同的位置,玩蜘蛛纸牌(牌面为i的能移到牌面为i+1上),从位置i到位置j移动的距离为abs(i-j),问完成游戏所需要的最短距离
做法:直接暴力dfs枚举所有的情况即可
#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
#include <algorithm>
#define maxn 304
using namespace std;
struct Card
{
int a, b;//a为底牌,b为最上面的牌
}card[40];
int ans=10010000;
void solve(int step,int sc)
{
if(sc>ans)return;
if(step==9)
{
ans=sc;
return;
}
//把i移到j上。。。
for(int i=0;i<10;i++)
{
if(card[i].a!=0)
for(int j=0;j<10;j++)
{
if(i==j)continue;
if(card[j].b-card[i].a==1)
{
int t=card[i].a;
int p=card[j].b;
int q=card[i].b;
card[j].b=card[i].b;
card[i].b=0;
card[i].a=0;
solve(step+1,sc+abs(i-j));
card[i].a=t;
card[j].b=p;
card[i].b=q;
}
}
}
}
int main()
{
int a;
int t;
scanf("%d",&t);
while(t--)
{
ans=1e10;
for(int i=0;i<10;i++)
{
scanf("%d",&card[i].a);
card[i].b=card[i].a;
}
solve(0,0);
printf("%d\n",ans);
}
//输出居然没管括号wa了几发,醉了。。。
return 0;
}