题意:
      给你一个n*m的格子,然后给你一个起点,让你遍历所有的垃圾,就是终点不唯一,问你最小路径是多少?

思路:
      水题,方法比较多,最省事的就是直接就一个BFS状态压缩暴搜就行了,时间复杂度20*20*1024的,完全可以接受,但是被坑了,一开始怎么交都TLE,后来又写了一个BFS+DFS优化,就是跑之前先遍历一遍图,看看是不是所有的垃圾点都能遍历到,这样还是超时,无奈看了下讨论,有人说用G++交就行了,我用G++交了结果两个方法都AC了,哎!下面是两个方法的代码,比较简单,最近就是无聊,上POJ来刷刷水题,还有这个题目,可以用DP去做,还有就是可以直接求出任意两个垃圾的最短距离,然后在枚举处理垃圾顺序,枚举可以用STL的全排列,也可以搜索,这样的时间复杂度大约是N!吧,跟直接暴搜没啥区别,想试的可以敲敲试试吧。

直接BFS状态压缩暴力625
#include<queue>
#include<stdio.h>
#include<string.h>

using namespace std;

typedef struct
{
    int x ,y ,k ,t;
}NODE;

NODE xin ,tou;
int map[22][22] ,n ,m ,w;
int mark[22][22][1025];
int dir[4][2] = {0 ,1 ,0 ,-1 ,1 ,0 ,-1 ,0};

bool ok(int x ,int y ,int k)
{
    return x >= 1 && x <= n && y >= 1 && y <= m && map[x][y] && !mark[x][y][k];
}

int BFS(int x ,int y)
{
    queue<NODE>q;
    xin.x = x ,xin.y = y;
    xin.t = 0 ,xin.k = 0;
    memset(mark ,0 ,sizeof(mark));
    mark[xin.x][xin.y][xin.k] = 1;
    q.push(xin);
    while(!q.empty())
    {
        tou = q.front();
        q.pop();
        for(int i = 0 ;i < 4 ;i ++)
        {
            xin.x = tou.x + dir[i][0];
            xin.y = tou.y + dir[i][1];
            xin.t = tou.t + 1;
            if(map[xin.x][xin.y] && map[xin.x][xin.y] != -1)
            xin.k = tou.k | (1 << (map[xin.x][xin.y] - 1));
            else xin.k = tou.k;
            if(ok(xin.x ,xin.y ,xin.k))
            {
                mark[xin.x][xin.y][xin.k] = 1;
                q.push(xin);
                if(xin.k == (1 << w) - 1) return xin.t;
            }
        }
    }
    return -1;
}

int main ()
{
    char str[22];
    int x ,y;
    while(~scanf("%d %d" ,&m ,&n) && n+m)
    {
        w = 0;
        for(int i = 1 ;i <= n ;i ++)
        {
            scanf("%s" ,str);
            for(int j = 1 ;j <= m ;j ++)
            {
                if(str[j-1] == '.') map[i][j] = -1;
                else if(str[j-1] == '*') map[i][j] = ++w;
                else if(str[j-1] == 'x') map[i][j] = 0;
                else x = i ,y = j ,map[i][j] = -1;
            }
        }
        w ? printf("%d\n" ,BFS(x ,y)):printf("0\n");
    }
    return 0;
}

BFS+DFS剪枝594
#include<queue>
#include<stdio.h>
#include<string.h>

using namespace std;

typedef struct
{
    int x ,y ,k ,t;
}NODE;

NODE xin ,tou;
int col[22][22] ,cmk[22][22];
int map[22][22] ,n ,m ,w;
int mark[22][22][1025];
int dir[4][2] = {0 ,1 ,0 ,-1 ,1 ,0 ,-1 ,0};

bool ok(int x ,int y ,int k)
{
    return x >= 1 && x <= n && y >= 1 && y <= m && map[x][y] && !mark[x][y][k];
}

int BFS(int x ,int y)
{
    queue<NODE>q;
    xin.x = x ,xin.y = y;
    xin.t = 0 ,xin.k = 0;
    memset(mark ,0 ,sizeof(mark));
    mark[xin.x][xin.y][xin.k] = 1;
    q.push(xin);
    while(!q.empty())
    {
        tou = q.front();
        q.pop();
        for(int i = 0 ;i < 4 ;i ++)
        {
            xin.x = tou.x + dir[i][0];
            xin.y = tou.y + dir[i][1];
            xin.t = tou.t + 1;
            if(map[xin.x][xin.y] && map[xin.x][xin.y] != -1)
            xin.k = tou.k | (1 << (map[xin.x][xin.y] - 1));
            else xin.k = tou.k;
            if(ok(xin.x ,xin.y ,xin.k))
            {
                mark[xin.x][xin.y][xin.k] = 1;
                q.push(xin);
                if(xin.k == (1 << w) - 1) return xin.t;
            }
        }
    }
    return -1;
}

void DFS(int x ,int y)
{
    for(int i = 0 ;i < 4 ;i ++)
    {
        int xx = x + dir[i][0];
        int yy = y + dir[i][1];
        if(xx >= 1 && xx <= n && yy >= 1 && yy <= m && !cmk[xx][yy] && map[xx][yy])
        {
            cmk[xx][yy] = 1;
            DFS(xx ,yy);
        }
    }
}

int main ()
{
    char str[22];
    int x ,y;
    while(~scanf("%d %d" ,&m ,&n) && n+m)
    {
        w = 0;
        for(int i = 1 ;i <= n ;i ++)
        {
            scanf("%s" ,str);
            for(int j = 1 ;j <= m ;j ++)
            {
                if(str[j-1] == '.') map[i][j] = -1;
                else if(str[j-1] == '*') map[i][j] = ++w;
                else if(str[j-1] == 'x') map[i][j] = 0;
                else x = i ,y = j ,map[i][j] = -1;
            }
        }
        memset(cmk ,0 ,sizeof(cmk));
        DFS(x ,y);
        int mk = 0;
        for(int i = 1 ;i <= n && !mk;i ++)
        for(int j = 1 ;j <= m && !mk;j ++)
        if(map[i][j] != -1 && map[i][j] && !cmk[i][j])
        mk = 1;
        if(mk)
        {
            printf("-1\n");
            continue;
        }

w ? printf("%d\n" ,BFS(x ,y)):printf("0\n");
    }
    return 0;
}

POJ2688状态压缩(可以+DFS剪枝)相关推荐

  1. 《算法竞赛进阶指南》打卡-基本算法-AcWing 92. 递归实现指数型枚举:递推与递归、二进制状态压缩、dfs

    文章目录 题目解答 题目链接 题目解答 分析: 优化:用二进制状态压缩,也就是用二进制上的位来记录数有没有被用过. ac代码 #include<bits/stdc++.h> using n ...

  2. jzoj3511-cza的蛋糕【状态压缩dp,dfs】

    正题 题目大意 n∗mn*mn∗m的矩阵,有些阻挡,求至少要多少个1∗21*21∗2或2∗12*12∗1的块铺在上面使得没用可以继续铺的地方. 解题思路 因为mmm很小,明显状压. 用fi,j,kf_ ...

  3. 《算法竞赛进阶指南》打卡-基本算法-AcWing 93. 递归实现组合型枚举:递归与递推、dfs、状态压缩

    文章目录 题目解答 题目链接 题目解答 分析: 此题和笔者另一篇博文很像,只不过是限定了个数.<算法竞赛进阶指南>打卡-基本算法-AcWing 92. 递归实现指数型枚举:递推与递归.二进 ...

  4. 提高篇 第五部分 动态规划 第4章 状态压缩类动态规划

    例1 骑士(Sgu223) 1592:[例 1]国王 信息学奥赛一本通(C++版)在线评测系统 https://blog.csdn.net/guoyangfan_/article/details/82 ...

  5. LeetCode 1723. 完成所有工作的最短时间(DFS+剪枝 / 状态压缩DP)

    文章目录 1. 题目 2. 解题 2.1 DFS 2.2 状态压缩DP 265 / 3871, 前6.85% 前3题题解: LeetCode 5649. 解码异或后的数组(位运算) LeetCode ...

  6. DFS 简单的剪枝和状态压缩 海贼王之伟大航路

    今天碰到了这样一道题目,是一个关于深搜的题目 4124:海贼王之伟大航路 查看 提交 统计 提示 提问 总时间限制:  1000ms  内存限制:  65536kB 描述 "我是要成为海贼王 ...

  7. uva10160(dfs+状态压缩)

    题意:给出n个点,以及m条边,这些边代表着这些点相连,修一个电力站,若在某一点修一个站,那么与这个点相连的点都可以通电,问所有的点都通电的话至少要修多少个电力站........ 思路:最多给出的是35 ...

  8. 状态压缩+dfs+背包

    状态压缩dp 状态压缩dp就是用二进制数字来表示状态,通过遍历所有状态确定答案,时间复杂度为o(nn2^n),通常只能用来解数据范围小于等于21的. P1433 吃奶酪 #include <bi ...

  9. 《算法竞赛进阶指南》打卡-基本算法-AcWing 94. 递归实现排列型枚举:dfs、二进制状态压缩

    文章目录 题目解答 题目来源 题目解答 分析: dfs求全排列,这里是用二进制状态压缩进行优化,二进制状态压缩,顾名思义,每个状态是用二进制的某一位表示.这里的体现是state这个状态,它的每一位代表 ...

最新文章

  1. LinkedIn领英发布《2016中国人才趋势报告》
  2. python自动化发送邮件_python接口自动化(三十三)-python自动发邮件总结及实例说明番外篇——下(详解)...
  3. 汇编解析(3)-nasm基础、物理地址
  4. 触发bfc的html元素,什么是BFC? CSS 使用伪元素清除浮动的方法
  5. iview 输入框_使用iview框架,如何进行输入框或者按钮的关联验证
  6. 基础原理系列:服务端 TCP 连接的 TIME_WAIT 问题
  7. image.merge图像有什么变化_经常用到压缩软件的你,知道什么是无损压缩和有损压缩吗?...
  8. TotalFinder for Mac(Finder增强工具)v1.14.1
  9. git中Bash基本操作命令
  10. Python3不需要uuid:导入/usr/local/lib/python3.x/site-packages/uuid.py提示if not 0 time_low 32L错误
  11. 亚马逊平板刷机Linux系统,亚马逊平板刷机步骤是什么样的?
  12. 马哥linux-多年内部专用电子书,马哥linux-多年积累-无价之宝books haproxy.pdf
  13. MVC2 扩展Models和自定义验证(学习笔记)
  14. 低通滤波器转带通滤波器公式由来_什么是低通滤波器
  15. 把Ethernet(以太网)基本工作原理说清楚
  16. Android7.0 PowerManagerService(4) Power按键流程
  17. 三苯基膦(TPP)负载碘化BODIPY光敏剂(BDPI)纳米颗粒(PBDPI-TPP)介绍
  18. Beaglebone Black - 准备
  19. matlab多元二次分析,Matlab篇----常用的回归分析Matlab命令(regress篇)
  20. 软件使用说明书_使用软件

热门文章

  1. php preg_replace 正则替换图片路径
  2. Centos6.6安装zabbix server 3.2
  3. Modular Multiplicative Inverse(模乘逆元)
  4. 那些年借“云”出海的日子
  5. 2014年中回首与展望
  6. 关于Linux和Windows双系统共存时间问题
  7. 依然在那条路上奋斗着
  8. npm: 权限阻止修复
  9. 表单的增 删 改 查
  10. UESTC 电子科大专题训练 数据结构 J