QDUOJ 炸老师与他的女朋友们 bfs+状压
炸老师与他的女朋友们
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+状压的更多相关文章
- QDUOJ 来自xjy的签到题(bfs+状压dp)
来自xjy的签到题 Description 爱丽丝冒险来到了红皇后一个n*n大小的花园,每个格子由'.'或'#'表示,'.'表示爱丽丝可以到达这个格子,‘#’表示爱丽丝不能到达这个格子,爱丽丝每1 ...
- 孤岛营救问题 (BFS+状压)
https://loj.ac/problem/6121 BFS + 状压 写过就好想,注意细节debug #include <bits/stdc++.h> #define read rea ...
- hdu 5094 Maze (BFS+状压)
题意: n*m的迷宫.多多要从(1,1)到达(n,m).每移动一步消耗1秒.有P种钥匙. 有K个门或墙.给出K个信息:x1,y1,x2,y2,gi 含义是(x1,y1)与(x2,y2)之间有gi ...
- hdu 4771 Stealing Harry Potter's Precious (BFS+状压)
题意: n*m的迷宫,有一些格能走("."),有一些格不能走("#").起始点为"@". 有K个物体.(K<=4),每个物体都是放在& ...
- 【BZOJ 3049】【USACO2013 Jan】Island Travels BFS+状压DP
这是今天下午的互测题,只得了60多分 分析一下错因: $dis[i][j]$只记录了相邻的两个岛屿之间的距离,我一开始以为可以,后来$charge$提醒我有可能会出现来回走的情况,而状压转移就一次,无 ...
- HDU 5025:Saving Tang Monk(BFS + 状压)
http://acm.hdu.edu.cn/showproblem.php?pid=5025 Saving Tang Monk Problem Description <Journey to ...
- hdu 4856 Tunnels (bfs + 状压dp)
题目链接 The input contains mutiple testcases. Please process till EOF.For each testcase, the first line ...
- 【HDU 4771 Stealing Harry Potter's Precious】BFS+状压
2013杭州区域赛现场赛二水... 类似“胜利大逃亡”的搜索问题,有若干个宝藏分布在不同位置,问从起点遍历过所有k个宝藏的最短时间. 思路就是,从起点出发,搜索到最近的一个宝藏,然后以这个位置为起点, ...
- hdu 2209 bfs+状压
http://acm.hdu.edu.cn/showproblem.php?pid=2209 不知为啥有种直觉.会出状压+搜索的题,刷几道先 简单的BFS.状压表示牌的状态, //#pragma co ...
随机推荐
- 我的Android进阶之旅------>Android利用Sensor(传感器)实现水平仪功能的小例
这里介绍的水平仪,指的是比较传统的气泡水平仪,在一个透明圆盘内充满液体,液体中留有一个气泡,当一端翘起时,该气泡就会浮向翘起的一端. 利用方向传感器返回的第一个参数,实现了一个指南针小应用. 我 ...
- div中p标签自动换行
只需要设置div的width属性,p标签加上word-break:break-word属性就会自动换行 ----------------2016.7.1-------------------- 今天在 ...
- SpringBoot学习笔记(10):使用MongoDB来访问数据
SpringBoot学习笔记(10):使用MongoDB来访问数据 快速开始 本指南将引导您完成使用Spring Data MongoDB构建应用程序的过程,该应用程序将数据存储在MongoDB(基于 ...
- jQuery:[2]百度地图开发平台实战
jQuery:[2]百度地图开发平台实战 原文链接: http://blog.csdn.net/moniteryao/article/details/51078779 快速开始 开发平台地址 ht ...
- MySQL 中事务的实现
在关系型数据库中,事务的重要性不言而喻,只要对数据库稍有了解的人都知道事务具有 ACID 四个基本属性,而我们不知道的可能就是数据库是如何实现这四个属性的: 在这篇文章中,我们将对事务的实现进行分析, ...
- C++函数模板的显示调用与隐式调用
C++函数模板可以显示调用与可以隐式调用 首先定义函数模板: template <class T> inline const T& c_max (const T& a, c ...
- matlab unique()函数
a = [30, 3,6; 19, 20, 20; 30,3, 6;] b=unique(a,'rows') 返回结果是: b = [19, 20 ,20; 30, 3, 6] b=uniqu ...
- 30个Jquery灯箱插件
jQuery 是非常流行的JS框架,其俨然已成了开发者的必备工具,其中的jQuery Lightbox插件更是为广大开发者所喜爱.它惊人的特征之一是jQuery Lightbox插件有很多变化. 下面 ...
- ES搜索排序,文档相关度评分介绍——Field-length norm
Field-length norm How long is the field? The shorter the field, the higher the weight. If a term app ...
- 小程序js页面设置上导航颜色
//导航条颜色更改 wx.setNavigationBarColor({ frontColor: '#ffffff', // 必写项 backgroundColor: '#008de6', // 必写 ...