hdu 1584 蜘蛛纸牌

题意:小牌叠在大牌上,问叠成一堆的最小移动距离

思路:将所有状况进行一次DFS

#include<bits/stdc++.h>
using namespace std;
int a[11];
int s;
int vis[11];
void dfs(int k,int ans)
{
if(ans>s)return ;//优化
if(k==10)//出口
{
if(ans<s)
s=ans;
return;
}
for(int i=1;i<=9;i++)//对函数10个情况进行穷举
{
if(!vis[i])
{vis[i]=1;//对已经用过的标记
for(int j=i+1;j<=10;j++)//对结果进行处理,这里是找到就处理,再跳出。
{
if(!vis[j])
{
dfs(k+1,ans+((j-i)>0?j-i:i-j));//缩小范围,在此举例子
break;
}

} vis[i]=0;//在这个用过后进行回溯,注意实在和子问题的下面,不能出范围,
}

}

}
int main()
{
int n;
cin>>n;
while(n--)
{
s=6555535;
int i; memset(vis,0,sizeof(vis));
for(i=1;i<=10;i++)//储存方式的改变·~~
{
int b;
cin>>b;
a[b]=i;;
}
dfs(1,0);
cout<<s<<endl;
}
return 0;
}

时间: 2024-10-29 15:29:31

hdu 1584 蜘蛛纸牌的相关文章

HDU 1584(蜘蛛牌 DFS)

题意是在蜘蛛纸牌的背景下求 10 个数的最小移动距离. 在数组中存储 10 个数字各自的位置,用深搜回溯的方法求解. 代码如下: 1 #include <bits/stdc++.h> 2 using namespace std; 3 int ans,a[20]; 4 bool vis[20]; 5 void dfs(int num,int sum) 6 { 7 if(sum > ans) return; 8 if(num == 9) 9 { 10 ans = sum; 11 return

hdu 1584 蜘蛛牌

陷入了思维误区,以为要用数组下标来记录牌的位置,看了别人的代码才发现是要用数组的值来记录牌的位置,转过这道弯之后就是道水题了 #include<iostream> #include<cmath> #include<cstring> #define maxn 10+2 using namespace std; int mapp[maxn],visit[maxn]; int re; void dfs(int t,int sum) { if(t==9){re=min(re,s

【DFS】hdu 1584 蜘蛛牌

看代码: #include <iostream> #include <cstdio> #include <fstream> using namespace std; const int INF=100000000; const int MAXN=1000000; int ans; int pos[11]; bool vis[11]; int abs(int a,int b){ if(a>b)return a-b; return b-a; } void dfs(in

蜘蛛纸牌存档文件,读取分数

#include <stdio.h> //蜘蛛纸牌存档文件,读取分数. int main(void) { FILE *rfile; int p[20]; rfile = fopen("d:\\spider.sav","rb+");//只能用rb+,不能用wb fseek(rfile,368,SEEK_SET);//368是170的十六进制,这个位置是要修改的内容所在的位置. fread(p,2,2,rfile);//重要 printf("%d\

HDU 2209 翻纸牌游戏(dfs)

翻纸牌游戏 Time Limit: 9000/3000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 2180    Accepted Submission(s): 787 Problem Description 有一种纸牌游戏,很有意思,给你N张纸牌,一字排开,纸牌有正反两面,开始的纸牌可能是一种乱的状态(有些朝正,有些朝反),现在你需要整理这些纸牌.但是麻烦的是,每当你翻一张

蜘蛛纸牌存档修改器

#include <stdio.h> //蜘蛛纸牌存档文件,修改分数. int main(void) { FILE *wfile; int n = 655320; wfile = fopen("d:\\spider.sav","rb+");//只能用rb+,不能用wb fseek(wfile,368,SEEK_SET);//368是170的十六进制,这个位置是要修改的内容所在的位置. fwrite(&n,1,3,wfile);//第三个参数:根据

hdu 2209 翻纸牌游戏

题目链接 http://acm.hdu.edu.cn/showproblem.php?pid=2209 这个题难度还可以 我的思路:有n张牌成第一张牌开始如果是1,则第一张第二张第三张翻转,再看第二张,判断如果是1则第二张第三张第四张翻转,以此下去 不这样还不可以,还得分两种情况如001 按这种思路是不可以的所以还有一种情况不管如何先翻转第一和第二张牌再如上一种思路. 我的AC代码 第一种写法:直接法 #include<cstdio>#include<iostream>#inclu

Win32小游戏--蜘蛛纸牌

前一段时间完成了蜘蛛纸牌的仿写,现将过程和思路记录下来 首先,为了符合复用性,在win32的基本框架中,把可变的部分用c++封装起来成为一系列虚函数,这样如果再继续写游戏的话,只需要继承这个类就可以了 CGameApp.h 1 #pragma once 2 class CGameApp //接口类 3 { 4 public: 5 virtual void OnCreatGame(){} 6 virtual void OnGameDraw(){} 7 virtual void OnGameRun(

hdu 1584 dfs+剪枝

蜘蛛牌 Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 3730    Accepted Submission(s): 1591 Problem Description 蜘蛛牌是windows xp操作系统自带的一款纸牌游戏,游戏规则是这样的:只能将牌拖到比她大一的牌上面(A最小,K最大),如果拖动的牌上有按顺序排好的牌时,那么这些牌也