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

#include <stdio.h>
#include <string.h> int a[15],vis[15],ans; int abs(int x)
{
if(x<0)
return -x;
return x;
} void dfs(int cnt,int sum)
{
int i,j;
if(sum>=ans)
return ;
if(cnt == 9)
{
ans = sum;
return ;
}
for(i = 1;i<10;i++)
{
if(!vis[i])
{
vis[i] = 1;
for(j = i+1;j<=10;j++)
{
if(!vis[j])
{
dfs(cnt+1,sum+abs(a[i]-a[j]));
break;
}
}
vis[i] = 0;
}
}
} int main()
{
int t,i,x;
scanf("%d",&t);
while(t--)
{
for(i = 1;i<=10;i++)
{
scanf("%d",&x);
a[x] = i;//牌面为x的牌在第i个位置
}
memset(vis,0,sizeof(vis));
ans = 10000000;
dfs(0,0);
printf("%d\n",ans);
} return 0;
}

最新文章

  1. Kafka 文档用例
  2. C#.NET 大型通用信息化系统集成快速开发平台 4.1 版本 - 忘记密码功能改进、手机短信、电子邮件
  3. Java基础知识学习(二)
  4. Blend操作入门: 别站在门外偷看,快进来吧!(转)
  5. unity, GL.TexCoord or GL.Color must put before GL.Vertex!!!
  6. android ANR
  7. Java 第六天 Spring Annotation 和其它
  8. Multi-bit per cell storage
  9. __file__ __name__ __doc__ argv详解
  10. MyBatis 源码分析——类型处理器
  11. 近期热门微信小程序demo源码下载汇总
  12. rapid framework开发系列(一)
  13. CentOS装个NTP时间同步服务器
  14. ASP.net的总结(一:理论理解)
  15. vector 内存释放相关
  16. Jack Straws(poj 1127) 两直线是否相交模板
  17. Java中将xml文件转化为json的两种方式
  18. Django入门与实践 17-26章总结
  19. Apache Hive 安装文档
  20. .net程序保护方式大观

热门文章

  1. poj3308 Paratroopers --- 最小点权覆盖-&amp;gt;最小割
  2. 改ucosii的中断禁止和恢复代码,这是一个荒谬的错误【 mrs msr】
  3. winform 之1---窗体介绍
  4. PAD会取代PC吗
  5. Android NumberPicker和DatePicker分割线颜色设置
  6. Jquery学习笔记:获取jquery对象的基本方法
  7. 基于visual Studio2013解决C语言竞赛题之0905文件读写显示
  8. php 上传文件代码
  9. JQuery EasyUI框架学习
  10. wkhtmltopdf 生成pdf