hdu1584 深搜水题

牌移动的步数为牌所在位置差的绝对值   
这道题用到深搜    每次出差跑牌面为1-9的牌  如果没移动过则尝试移动  如果能移动   就深搜下去  注意回溯


#include<stdio.h>
#include<string.h>
#include<iostream>
using namespace std;

int mark[15],num[15],Min;
int abs(int a)
{
    return a>0?a:-a;
}
int dfs(int sum,int coun)
{
    int i,j;
    if(sum>Min) return 0;//这里是一个优化  好像没有就会超时吧
    if(coun==9)
    {
        Min=sum;
        return 0;
    }
    for(i=1;i<10;i++)//列举1-9张牌  应为第10 号牌一定不用移动
    {
        if(!mark[i])
        {
            for(j=i+1;j<=10;j++)//找到牌i能移到的牌
            {
                if(!mark[j])
                {
                    mark[i]=1;
                    dfs(sum+abs(num[j]-num[i]),coun+1);
                    break;
                }
            }
            mark[i]=0;//回溯
        }
    }
    return 0;
}
int main()
{
    int i,T,a;
    scanf("%d",&T);
    while(T--)
    {
        for(i=1;i<=10;i++)
        {
            scanf("%d",&a);
            num[a]=i;//记录每张牌所在位置
        }

        memset(mark,0,sizeof(mark));
        Min=9999999;
        dfs(0,0);

        printf("%d\n",Min);
    }
    return 0;
}

} return 0;}

时间: 2024-10-18 16:20:04

hdu1584 深搜水题的相关文章

hdu1426 深搜水题

简单深搜   关键是输入格式问题 #include<stdio.h> #include<iostream> #include<string.h> using namespace std; int line[15][15],row[15][15],mark[5][5][15],map[15][15],num; int leap[100][3]; int dfs(int t) { int i; int a=leap[t][1],b=leap[t][2]; for(i=1;i

hdu1010-Tempter of the Bone DFS深搜入门题+奇偶剪枝

Tempter of the Bone Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 69699    Accepted Submission(s): 19176 Problem Description The doggie found a bone in an ancient maze, which fascinated him a

HDU 3316 爆搜水题

爆搜水题 模拟扫雷,规则和扫雷一样 给出原图,求在X,Y位置点一下以后的图形,没有弹出的点输出-1,弹出的点输出这个点的数字 从起始点DFS一下即可 #include "stdio.h" #include "string.h" int dir[8][2]={ {-1,0},{-1,1},{0,1},{1,1},{1,0},{1,-1},{0,-1},{-1,-1} }; int n; int hash[110][110]; char str[110][110]; i

HDU 2717 深搜第一题、

题意:求n到k的最小路径,  n有三种变法 n+1,n-1或者2*n: 贴个广搜的模版在这里把.... 总结一下:一般涉及到求最短路的话用深搜 1 #include<iostream> 2 #include<cstdio> 3 #include<algorithm> 4 #include<queue> 5 #include<cstring> 6 using namespace std; 7 const int qq=1e5+10; 8 int v

HDU - 1010 Tempter of the Bone 深搜模板题(DPS)解题报告

Tempter of the Bone Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 88587    Accepted Submission(s): 24116 Problem Description The doggie found a bone in an ancient maze, which fascinated him a

HDU 1036 Robot Motion 深搜

 Description A robot has been programmed to follow the instructions in its path. Instructions for the next direction the robot is to move are laid down in a grid. The possible instructions are N north (up the page) S south (down the page) E east (t

7.5 深搜-最佳调度问题(枚举排列+回溯+剪枝)

这几天偷了几天懒,今天为大家讲解一篇深搜好题,典型的全排列问题需运用剪枝+回溯来优化运行时间,与上一道都是比较典型的深搜优化问题. 题目描述 假设有n个任务由k个可并行工作的机器完成,完成任务i需要的时间为ti,对任意给定的整数n和k,以及完成任务i需要的时间ti,设计一个算法,求完成这n个任务的最佳调度,使得完成全部任务的时间最早. 输入 第一行有2个正整数n和k,第二行有n个正整数,表示ti n<7000,c<maxlongin 输出 一个整数,输出最早时间 样例输入 7 3 2 14 4

leetcode 深搜广搜

遍历整个grid数组,当发现有1的时候,就把和这个1连成片的1都置为0,并增加一个计数.最后返回这个计数. 广搜,但这个代码通不过测试,栈溢出. class Solution { public: void bfs(vector<vector<char>>& grid,int i,int j){ if(i<0||j<0||i>=grid.size()||j>=grid[0].size()) return; if(grid[i][j]=='0') ret

水叮当的舞步 深搜

背景 Background 水叮当得到了一块五颜六色的格子形地毯作为生日礼物,更加特别的是,地毯上格子的颜色还能随着踩踏而改变. 为了讨好她的偶像虹猫,水叮当决定在地毯上跳一支轻盈的舞来卖萌~~~ 描述 Description 地毯上的格子有N行N列,每个格子用一个0~5之间的数字代表它的颜色. 水叮当可以随意选择一个0~5之间的颜色,然后轻轻地跳动一步,左上角的格子所在的联通块里的所有格子就会变成她选择的那种颜色.这里连通定义为:两个格子有公共边,并且颜色相同. 由于水叮当是施展轻功来跳舞的,