找宝箱 (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, ...
随机推荐
- Android动态权限申请
Android系统中,目前Dangerous级别的权限都需要动态申请.步骤如下: 1.AndroidManfiest.xml中申明需要的动态权限 <?xml version="1.0& ...
- MYSQL 查询方法 统计查询 链接查询 子查询
mysql表格查询方法: 查询: 1.简单查询 select * from Info --查所有数据select Code,Name from Info --查指定列的数据select Code as ...
- 读取Java文件到byte数组的三种方式
package zs; import java.io.BufferedInputStream; import java.io.ByteArrayOutputStream; import java.io ...
- vue热重载
依据官网使用 webpack 的 Hot Module Replacement API,Vuex 支持在开发过程中热重载 mutation.module.action 和 getter.你也可以在 B ...
- 【译】x86程序员手册36-9.9异常汇总
9.9 Exception Summary 异常汇总 Table 9-6 summarizes the exceptions recognized by the 386. Table 9-6. Exc ...
- 迅为双核imx6DL核心板_ARM定制专家_Cortex SATA 千兆网 4G GPS
核心板参数 尺寸:51mm*61mm CPU:Freescale Cortex-A9 双核精简版 i.MX6DL,主频 1.2 GHz 内存:1GB DDR3 存储:8GB EMMC 存储 EEPRO ...
- [分享] IMX6嵌入式开发板linux QT挂载U盘及TF卡
本文转自迅为开发板:http://www.topeetboard.com 开发平台:iMX6开发板 linux QT 系统下挂载 u 盘如下图所示,qt 启动之后,在超级终端中使用命令“mknod / ...
- Day3 CSS 引入及基本选择器
一 .CSS 层叠样式表,为了使网页元素的样式更加丰富,内容与样式拆分开来.HTML负责结构与内容,表现形式交给CSS. CSS注释/**/ 来注释 二.CSS基本语法与引用 CSS的语法结构 选择器 ...
- JVM:内存分配与回收策略
Java技术体系中所提倡的自动内存管理最终可以归结为自动化的解决了两个问题:给对象分配内存以及回收分配给对象的内存. 对象的内存分配,往大方向讲,就是在堆上分配(但也可能经过JIT编译后被拆散为标量类 ...
- Vue完成TodoList案例
写一个简单的TodoList的更实用(文末有彩蛋). 一,使用VUE-CLI脚手架快速搭建一个框架 利用VUE-CLI来自动生成我们项目的前端目录及文件,方法: npm install -g vue- ...