炸老师与他的女朋友们

Description

qdu最帅的炸老师今天又要抽空去找他的女朋友们了,但是考虑到他的好gay友ycb仍是个单身狗,炸老师作为基友不希望打击他。所以他在找女朋友们的路途中必须要避开ycb老师,可他又不知道ycb的具体位置,只知道一些可能的位置,所以他必须要避开所有这些位置,同时炸老师希望找完所有女朋友所用的时间最短,因为炸老师很忙的。

现在假定炸老师在一个n*m的矩阵中,'S'为炸老师的初始位置,'.'表示可以走,'#'表示ycb老师的可能位置,'*'表示炸老师所有女朋友的位置,炸老师每走一格需要花费一秒的时间,而且炸老师每次只能往上下左右四个方向走,请你帮炸老师计算一下他找完所有女朋友所需的最短时间(找完最后一个女朋友即可,无需回到出发点),由于炸老师非常特别无敌快,因此可以不考虑炸老师在女友家停留的时间。如果炸老师没有办法在避开ycb所有可能位置的条件下找完他的女朋友们,那么炸老师就不去了。

Input

输入包含多组测试样例 第一行输入两个整数n,m表示n行m列的矩阵(0<n,m<=30) 第二行到n+1行每行m个字符,含义如上题所述。(输入保证*的个数不会超过10个,毕竟炸老师的精力也是有限的)

Output

对于每组输出,输出只包含一个整数。如果炸老师可以找完他的女朋友们,则输出最短时间,如果炸老师不去了,那么输出-1.

Sample Input 1

7 13
*...........*
....#...#....
..#...#..#...
..#......#...
...#.S..#....
....#.#......
*....#......*

Sample Output 1

33

Sample Input 2

10 10
..........
..S.......
..........
..........
..........
.....#####
.....#....
.....#.*..
.....#....
.....#....

Sample Output 2

-1

Sample Input 3

3 7
.S...*.
.......
.*...*.

Sample Output 3

8

Hint

Source

六一八杯青岛大学首届编程大赛个人赛暨ACM集训队16级纳新

回顾acm纳新。小数据,一道经典的状压题。因为部分路径能够重复走,所以这里的b[x][y][sta]数组需要标记状态,sta每一位表示每个女朋友是否被访问到。只有在(x,y)走过且当前状态被标记过时,该点才不会继续加入队列。

#include<iostream>
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<string>
#include<math.h>
#include<queue>
#include<stack>
#include<algorithm>
#define MAX 35
#define INF 0x3f3f3f3f
#define MOD 1000000007
using namespace std;
typedef long long ll; char a[MAX][MAX];
int b[MAX][MAX][(<<)+],bb[MAX][MAX];
int t[][]={{,},{,},{-,},{,-}};
struct Node{
int x,y,sta,s;
}node;
queue<Node> q;
int main()
{
int n,m,c,bx,by,i,j;
while(~scanf("%d%d",&n,&m)){
c=;
memset(bb,,sizeof(bb));
for(i=;i<n;i++){
scanf(" %s",a[i]);
for(j=;j<m;j++){
if(a[i][j]=='*'){
bb[i][j]=c;
c++;
}
else if(a[i][j]=='S'){
bx=i;
by=j;
}
}
}
memset(b,,sizeof(b));
while(q.size()){
q.pop();
}
node.x=bx;
node.y=by;
node.sta=;
node.s=;
b[bx][by][]=;
q.push(node);
int f=-;
while(q.size()){
for(i=;i<;i++){
int tx=q.front().x+t[i][];
int ty=q.front().y+t[i][];
int sta=q.front().sta;
int ss=q.front().s;
if(tx<||ty<||tx>=n||ty>=m) continue;
if(a[tx][ty]=='#') continue;
if(a[tx][ty]=='*') sta|=<<bb[tx][ty];
if(b[tx][ty][sta]==) continue;
b[tx][ty][sta]=;
if(sta==(<<c)-){
f=ss+;
break;
}
node.x=tx;
node.y=ty;
node.sta=sta;
node.s=ss+;
q.push(node);
}
q.pop();
if(f>-) break;
}
if(f==-) printf("-1\n");
else printf("%d\n",f);
}
return ;
}

QDUOJ 炸老师与他的女朋友们 bfs+状压的更多相关文章

  1. QDUOJ 来自xjy的签到题(bfs+状压dp)

    来自xjy的签到题   Description 爱丽丝冒险来到了红皇后一个n*n大小的花园,每个格子由'.'或'#'表示,'.'表示爱丽丝可以到达这个格子,‘#’表示爱丽丝不能到达这个格子,爱丽丝每1 ...

  2. 孤岛营救问题 (BFS+状压)

    https://loj.ac/problem/6121 BFS + 状压 写过就好想,注意细节debug #include <bits/stdc++.h> #define read rea ...

  3. hdu 5094 Maze (BFS+状压)

    题意: n*m的迷宫.多多要从(1,1)到达(n,m).每移动一步消耗1秒.有P种钥匙. 有K个门或墙.给出K个信息:x1,y1,x2,y2,gi    含义是(x1,y1)与(x2,y2)之间有gi ...

  4. hdu 4771 Stealing Harry Potter's Precious (BFS+状压)

    题意: n*m的迷宫,有一些格能走("."),有一些格不能走("#").起始点为"@". 有K个物体.(K<=4),每个物体都是放在& ...

  5. 【BZOJ 3049】【USACO2013 Jan】Island Travels BFS+状压DP

    这是今天下午的互测题,只得了60多分 分析一下错因: $dis[i][j]$只记录了相邻的两个岛屿之间的距离,我一开始以为可以,后来$charge$提醒我有可能会出现来回走的情况,而状压转移就一次,无 ...

  6. HDU 5025:Saving Tang Monk(BFS + 状压)

    http://acm.hdu.edu.cn/showproblem.php?pid=5025 Saving Tang Monk Problem Description   <Journey to ...

  7. hdu 4856 Tunnels (bfs + 状压dp)

    题目链接 The input contains mutiple testcases. Please process till EOF.For each testcase, the first line ...

  8. 【HDU 4771 Stealing Harry Potter's Precious】BFS+状压

    2013杭州区域赛现场赛二水... 类似“胜利大逃亡”的搜索问题,有若干个宝藏分布在不同位置,问从起点遍历过所有k个宝藏的最短时间. 思路就是,从起点出发,搜索到最近的一个宝藏,然后以这个位置为起点, ...

  9. hdu 2209 bfs+状压

    http://acm.hdu.edu.cn/showproblem.php?pid=2209 不知为啥有种直觉.会出状压+搜索的题,刷几道先 简单的BFS.状压表示牌的状态, //#pragma co ...

随机推荐

  1. 在调用Response.End()时,会执行Thread.CurrentThread.Abort()操作

    在调用Response.End()时,会执行Thread.CurrentThread.Abort()操作. 如果将Response.End()放在try...catch中,catch会捕捉Thread ...

  2. php+mysql 安全

    Php注入攻击是现今最流行的攻击方式,依靠它强大的灵活性吸引了广大黑迷. 在上一期的<php安全与注射专题>中林.linx主要讲述了php程序的各种漏洞,也讲到了php+mysql注入的问 ...

  3. SAP采购寄售业务操作步骤

    [转自 http://blog.sina.com.cn/s/blog_6466e5f70100jghg.html] 这里所示的是比较完整的步骤,包含了:信息记录.采购合同.货源清单.采购申请.采购订单 ...

  4. 添加@ControllerAdvice后报错 Failed to invoke @ExceptionHandler method

    首先.单独使用ControllerAdvice 无法正常工作.需要配合@EnableWebMvc 使用. @ControllerAdvice @EnableWebMvc pulbic class Ex ...

  5. Java for LeetCode 081 Search in Rotated Sorted Array II

    Follow up for "Search in Rotated Sorted Array": What if duplicates are allowed? Would this ...

  6. ubuntu把文件移动到指定的文件夹

    有个文件a.txt在/etc下,想把它移动到/etc/fuck文件夹中 cd /etc/fuck sudo mv a.txt 要移动到的文件夹 没报错就成功了

  7. Ubuntu apt-get update 失败【转】

    本文转载自:http://www.jianshu.com/p/0de2b5717ce8 1 $ sudo apt-get update 报了一堆错误: Err http://cn.archive.ub ...

  8. Mockito @BeforeClass @BeforeMethod @BeforeTest 的生命周期

    @BeforeClass---@AfterClass 类实例化前, 被执行, 主要用于设置环境变量等, 与SpringTestContext结合用的时候要注意, 这种情况下@autowire的bean ...

  9. 一个关于前端页面的小标签<tbody>

    我们有时候希望将表格的内容分为多个模块,这时候就可以使用<tbody>标签,它是<table>的字标签,是<tr>的父标签,可以使用它达到一种设置样式的结果.

  10. PS 色调— —颜色梯度

    clc; clear all; close all; addpath('E:\PhotoShop Algortihm\Image Processing\PS Algorithm'); I=imread ...