找宝箱 (bfs)
Problem Description
Input
Output
Sample Input
3 5
1 -1 1 -1 2
0 -1 0 -1 0
0 0 0 0 0
0 0
很久之前遇到的题现在又偶然遇到了,当初一直没看懂,现在终于懂了,不过找不到出处在哪了。
因为要收集完所有宝箱,把起点也作为宝箱,然后求出所有宝箱的两两距离,最后枚举所有 的情况求出最小值.
枚举的时候借用了全排列,方法很巧妙。
#include<iostream>
#include<cstring>
#include<stdio.h>
#include<queue>
#include<algorithm>
using namespace std;
const int M=;
int n,m;
int map[M][M]; //迷宫
struct point
{
int r;
int l;
} p[]; //记录宝箱位置和初始位置
int run[][]= {,,-,,,,,-}; //bfs的方向数组
int bfs(point x,point y) //求两个宝箱的最短距离
{
int r,l,i,now,next,a[M][M]= {},mp[M][M];
queue<int> qu;
now=x.r*m+x.l;
qu.push(now);
for(i=; i<n; i++) //因为要调用计算多次,所以map不能改变,每次用map 初始mp
for(l=; l<m; l++)
mp[i][l]=map[i][l];
while(!qu.empty())
{
now=qu.front();
qu.pop();
for(i=; i<; i++)
{
r=now/m+run[i][];
l=now%m+run[i][];
next=r*m+l;
if(r>= &&r<n && l>= && l<m && mp[r][l]!=-)
{
a[r][l]+=a[now/m][now%m]+;
qu.push(next);
mp[r][l]=-;
if(r==y.r && l==y.l)
return a[r][l];
}
}
}
return -; //不通时返回
}
int main()
{
freopen("a.txt","r",stdin);
int i,j,num,min,dis[M][M];//dis数组保存第i个宝箱到第j个宝箱的最短距离
while(scanf("%d%d",&n,&m)!=EOF && n!= && m!=)
{
memset(dis,,sizeof(dis));
int flag=;//若有宝箱不能到达的标志
min=;
num=;
for(i=; i<n; i++)
for(j=; j<m; j++)
{
cin>>map[i][j];
if(map[i][j]==)
{
p[].r=i;
p[].l=j;
}
if(map[i][j]== )
{
p[num].r=i;
p[num++].l=j;
}
}
for(i=; i<num; i++)
{
for(j=; j<num; j++)
if(i!=j)
{
dis[i][j]=bfs(p[i],p[j]);
if(dis[i][j]==-)
{
flag=;
break;
}
}
if(flag)
break;
}
if(flag)
{
printf("-1\n");
continue;
}
char a[]= {""};
//因为最多有5个宝箱,用这个字符串代表排列的顺序,看下面会懂的,有点妙!
do
{
int s=;
for(i=; i<num-; i++)
{
s+=dis[a[i]-''][a[i+]-''];
}
if(min>s) //判断每种情况,
min=s;
}
while(next_permutation(a+,a+num));
//一个库函数 第一次经过他之后a[6]={"02354"}
printf("%d\n",min);
}
return ;
}
找宝箱 (bfs)的更多相关文章
- 【CodeForces - 598D】Igor In the Museum(bfs)
Igor In the Museum Descriptions 给你一个n*m的方格图表示一个博物馆的分布图.每个方格上用'*'表示墙,用'.'表示空位.每一个空格和相邻的墙之间都有一幅画.(相邻指的 ...
- bzoj 1064
题意:戳这里 思路:很明显是一个图论模型.. 就两种图形: 1.图中存在环,那么就是所有环的gcd为最大答案.gcd的大于3的最小约数为最小答案 2.不存在环,那么是每个弱连通块的最长链之和为最大答案 ...
- 圣诞福利到!51Testing邀你一起来狂欢!有礼就是任性~(≧▽≦)/~
“我想变成一棵树,一棵只为你存在的圣诞树,顶上最大最亮的那颗星是我的真心,下面挂满我对你的祝福. 你的关注是我的幸福,你的肯定是我的力量,而我将用更多精彩的内容,用心的分享,给你下一个一整年的 精彩! ...
- NOIP 2009 最优贸易
题目描述 C 国有 n 个大城市和 m 条道路,每条道路连接这 n 个城市中的某两个城市.任意两个 城市之间最多只有一条道路直接相连.这 m 条道路中有一部分为单向通行的道路,一部分 为双向通行的道路 ...
- 洛谷P1605走迷宫
传送 这是一道dfs,但是...但是....但是它竟然被放在bfs练习题辣!!!! 打了半天bfs,发现路径不会标记了,于是发现好像有什么不对的,似乎dfs要简单一点,于是半路跑去打dfs,结果打了半 ...
- [USACO5.1]夜空繁星Starry Night
题目背景 高高的星空,簇簇闪耀的群星形态万千.一个星座(cluster)是一群连通的星组成的非空连通星系,这里的连通是指水平,垂直或者对角相邻的两个星星.一个星座不能是另一个更大星座的一部分, 星座可 ...
- HDU5957 Query on a graph(拓扑找环,BFS序,线段树更新,分类讨论)
传送门:http://acm.hdu.edu.cn/showproblem.php?pid=5957 题意:D(u,v)是节点u和节点v之间的距离,S(u,v)是一系列满足D(u,x)<=k的点 ...
- hihocoder#1050 : 树中的最长路(树中最长路算法 两次BFS找根节点求最长+BFS标记路径长度+bfs不容易超时,用dfs做TLE了)
#1050 : 树中的最长路 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 上回说到,小Ho得到了一棵二叉树玩具,这个玩具是由小球和木棍连接起来的,而在拆拼它的过程中, ...
- POJ-3984 迷宫问题(BFS找最短路径并保存)
问题: 定义一个二维数组: int maze[5][5] = { 0, 1, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, ...
随机推荐
- python版本2和3使用range()函数方法
python 2:可以直接使用range(5) 输入的列表结果和预期的一样 python 3:使用range(5) 得到列表结果却是这个,和预期的不一致,其原因是节省空间,防止过大的列表产生 如果想要 ...
- AJPFX理解反射及反射的应用
怎么理解反射,反射的应用 反射就是把Java类中的各种成分映射成相应的Java类. 一般情况下我们要解决某个问题,先找到相关的类,创建该类的对象,然后通过该对象调用对应的方 ...
- Java用SAX解析XML
要解析的XML文件:myClass.xml <?xml version="1.0" encoding="utf-8"?> <class> ...
- react学习文档
转自http://www.ruanyifeng.com/blog/2015/03/react.html,阮一峰老师的博客. 最近想学习react,官方文档的例子不是那么浅显易懂,看了相关博客,觉得阮一 ...
- Bmob使用心得
1.在 Project 的 build.gradle 文件中添加 Bmob的maven仓库地址,示例如下:(注意文字说明部分): allprojects { repositories { jcente ...
- js添加千位分隔符
function thousandBitSeparator(num){ var re=/\d{1,3}(?=(\d{3})+$)/g; var n1=num.toString().replace(/^ ...
- 【4412开发板使用经验分享】迅为4412开发板I2C驱动问题
本文转自迅为论坛:bbs.topeetboard.com 我想写DS3231 的驱动 但是读回的数据老是-6 硬件: 我I2C设备连接的这几个GPIO,看了2.5的手册,接口应该是链接正确的 软件 分 ...
- OpenFlow_tutorial_3_Learn_Development_Tools
一.Several Utilities OpenFlow Tutorial VM 中预装了一些OpenFlow特性的工具和一般通用网络的工具. 1.Openflow Controller:处于Open ...
- Shorthand Argument Names $0 : 只用于指代Closer声明中的形参
Shorthand Argument Names Swift automatically provides shorthand argument names to inline closures, w ...
- h5 移动端 监听软键盘弹起、收起
前面一篇博客 h5 安卓 键盘弹起界面适配 修改webview高度提到了在adnroid中如何监听软键盘的弹起与收起,是利用的窗口的高度发生变化window.onresize事件来做突破点的,但是io ...