Time limit(ms): 1000      Memory limit(kb): 65535
 

江鸟突然想到了一个迷宫逃离的游戏,话说有三个人被困于一个n*m的迷宫里,他们三人都可以向上、向下、向左、向右四个方向进行走动,当然他们所在的初始位置没有障碍物,同时只能走到没有障碍物的格子上,现在江鸟要问你最少需要去掉多少个格子的障碍物,可以使他们三人之间两两互相可达。

Description

输入包括多组测试数据,每组测试数据第一行为两个整数n和m(2<=n,m<=100),接下来n行,每行m个字符,其中:‘w’、‘W’、‘f’分别代表那三个人;‘.’代表没有障碍物的格子,‘#’代表有障碍物的格子。

Input

每组数据输出一行。

Output
1
2
3
4
5
6
7
8
9
10
11
4 4
w...
####
.##f
W##.
4 4
w...
....
.##f
.W..
 
Sample Input
1
2
3
2
0
 
Sample Output
Hint
信息学院院赛
 
集体思路:直接打表3个人每个人到每一个点需要去掉障碍的个数,然后枚举可到达点计算最小值即可~
     具体的可以看代码内注释
代码如下:
 #include <iostream>
#include <cstdio>
#include <cstring>
#include <queue>
using namespace std; #define inf 0x3f3f3f3f
#define maxn 110
struct node{
int x, y;
};
int n, m;
node p[];
char mpt[maxn][maxn];
int vis[maxn][maxn][];//vis分别代表每个人到每一个点需要消掉的障碍物
int dir[][] = { , , -, , , , , - }; void bfs(int index)
{
queue<node> q;
node now, next;
now.x = p[index].x;
now.y = p[index].y;
q.push(now);
vis[now.x][now.y][index] = ;
while (!q.empty()){
now = q.front();
q.pop();
for (int i = ; i < ; i++){
next = now;
next.x += dir[i][];
next.y += dir[i][];
if (next.x< || next.x>n || next.y< || next.y>m) continue;
int tmp = vis[now.x][now.y][index];
if (mpt[next.x][next.y] == '#')tmp++;//遇到一个障碍物,那么此人到达这个点需要消掉的障碍物加1
if (tmp < vis[next.x][next.y][index]){
//判断是否可以让需要消掉的障碍物更小
vis[next.x][next.y][index] = tmp;
q.push(next);
}
}
}
}
int main(){
while (~scanf("%d%d", &n, &m)){
memset(vis, inf, sizeof(vis));
for (int i = ; i <= n; i++) scanf("%s", mpt[i] + );
for (int i = ; i <= n; i++){
for (int j = ; j <= m; j++){
if (mpt[i][j] == 'w') p[].x = i, p[].y = j;
else if (mpt[i][j] == 'W') p[].x = i, p[].y = j;
else if (mpt[i][j] == 'f') p[].x = i, p[].y = j;
}
}
//对每一个人计算出到每一个点需要消掉的最少障碍物
bfs();
bfs();
bfs();
int ans = inf;
for (int i = ; i <= n; i++){
//如果三个人两两可以到达,那么他们可以集聚在一个点,下面枚举每一个这样的点
for (int j = ; j <= m; j++){
int tmp = ;
for (int k = ; k <= ; k++) tmp += vis[i][j][k];
if (mpt[i][j] == '#') tmp -= ;//如果在一个'#'集聚,那么就会多计算2个
ans = ans < tmp ? ans : tmp;
}
}
printf("%d\n", ans);
}
return ;
}

[Swust OJ 191]--迷宫逃离(打表搜索)的更多相关文章

  1. [swustoj 191] 迷宫逃离

    迷宫逃离(0191) 描述 江鸟突然想到了一个迷宫逃离的游戏,话说有三个人被困于一个n*m的迷宫里,他们三人都可以向上.向下.向左.向右四个方向进行走动,当然他们所在的初始位置没有障碍物,同时只能走到 ...

  2. [Swust OJ 1023]--Escape(带点其他状态的BFS)

    解题思路:http://acm.swust.edu.cn/problem/1023/ Time limit(ms): 5000 Memory limit(kb): 65535     Descript ...

  3. SWUST OJ NBA Finals(0649)

    NBA Finals(0649) Time limit(ms): 1000 Memory limit(kb): 65535 Submission: 404 Accepted: 128   Descri ...

  4. Yii 1开发日记 -- 后台搜索功能下拉及关联表搜索

    Yii 1 实现后台搜索,效果如下: 一. 下拉搜索: 1.模型中和常规的一样 if (isset($_GET['agency']['status']) && $_GET['agenc ...

  5. [Swust OJ 404]--最小代价树(动态规划)

    题目链接:http://acm.swust.edu.cn/problem/code/745255/ Time limit(ms): 1000 Memory limit(kb): 65535   Des ...

  6. [Swust OJ 649]--NBA Finals(dp,后台略(hen)坑)

    题目链接:http://acm.swust.edu.cn/problem/649/ Time limit(ms): 1000 Memory limit(kb): 65535 Consider two ...

  7. [Swust OJ 409]--小鼠迷宫问题(BFS+记忆化搜索)

    题目链接:http://acm.swust.edu.cn/problem/409/ Time limit(ms): 1000 Memory limit(kb): 65535   Description ...

  8. [Swust OJ 1125]--又见GCD(数论,素数表存贮因子)

    题目链接:http://acm.swust.edu.cn/problem/1125/ Time limit(ms): 1000 Memory limit(kb): 65535   Descriptio ...

  9. [Swust OJ 1126]--神奇的矩阵(BFS,预处理,打表)

    题目链接:http://acm.swust.edu.cn/problem/1126/ Time limit(ms): 1000 Memory limit(kb): 65535 上一周里,患有XX症的哈 ...

随机推荐

  1. java和.net 处理任意格式日期字符串转日期类型,

    1.SimpleDateFormat.parse 把指定格式字符串转日期类型 public static Calendar convToCalender(String str,String templ ...

  2. PHP的排列组合问题 分别从每一个集合中取出一个元素进行组合,问有多少种组合?

    首先说明这是一个数学的排列组合问题C(m,n) = m!/(n!*(m-n)!) 比如:有集合('粉色','红色','蓝色','黑色'),('38码','39码','40码'),('大号','中号') ...

  3. [LeetCode]题解(python):095-Unique Binary Search Trees II

    题目来源: https://leetcode.com/problems/unique-binary-search-trees-ii/ 题意分析: 给一个整数,返回所有中序遍历是1到n的树. 题目思路: ...

  4. [转] iOS多线程编程之NSOperation和NSOperationQueue的使用

    <iOS多线程编程之NSThread的使用> 介绍三种多线程编程和NSThread的使用,这篇介绍NSOperation的使用. 使用 NSOperation的方式有两种, 一种是用定义好 ...

  5. MVC-03 控制器(5)

    八.动作过滤器 有时在运行Action之前或之后会需要运行一些逻辑运算,以及处理一些运行过程中所生成的异常状况,为了满足这个需求,ASP.NET MVC提供动作过滤器(Action Filter)来处 ...

  6. Android系统智能指针的设计思路(轻量级指针、强指针、弱指针)

    本博客为原创,转载请注明出处,谢谢. 参考博文:Android系统的智能指针(轻量级指针.强指针和弱指针)的实现原理分析 C++中最容易出错的地方莫过于指针了,指针问题主要有两类,一是内存泄露,二是无 ...

  7. C/C++中的内存管理

    一.内存的分配方式 1. 程序代码区 2. 静态数据区 3. 动态数据区 二.动态内存 1. 在栈上创建的内存 2. 从堆上分配的内存 3. 小结 三.指针与内存 1. 操作内存 2. 指针与数组 3 ...

  8. viewpager的layout_width="wrap_content"无效问题

    在viewpager当中直接使用layout_width="wrap_content"是无效的,扩展了一下.解决这个问题. package com.soulagou.ui; imp ...

  9. ActionBarSherlock的使用--------(一)配置

    ActionBarSherlock的使用--(一)配置 简介: 从android 3.0开始,android加入了一个新的api,actoinbar,随着android 4.0的发布和慢慢的推广开来, ...

  10. Tree(未解决。。。)

    Tree Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Total Submi ...