题目链接:http://lightoj.com/volume_showproblem.php?problem=1426

思路:首先我们预处理出每一个"*"在某一方向上最终能到达的位置,这里我们可以用一个四维数组来记录next[i][j][k][2],然后首先判断"impossible"这种情况,我们可以对每个"*"进行dfs,看是否能够到达边界,如果存在某个“*”不能到达边界,那么直接就是"impossible“了。判断好这个之后就可以直接bfs求解了,这里我们用map<vector<int,int>,string >mp来判重,我们可以枚举4个方向,然后对于那些不能到达边界的点,加入到一个vector向量中,如果最后我们能够找到一个为空的vector,那么说明找到了这样的指令可以是所有的"*"都能按照这样的指令到达边界。

 #include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <vector>
#include <queue>
#include <string>
#include <map>
using namespace std; const int MAXN = ;
typedef pair<int,int >Pair; char Map[MAXN][MAXN];
int n,m;
int dir[][] = { {,},{-,},{,},{,-} };
vector<Pair >Pos;
int next[MAXN][MAXN][][];
bool Judge(int x, int y)
{
if(x >= &&x <= n&&y >= &&y <=m)
return true;
return false;
}
bool mark[MAXN][MAXN];
bool dfs(int x, int y)
{
mark[x][y] = true;
for(int i = ; i < ; i++){
int xx = next[x][y][i][];
int yy = next[x][y][i][];
if(!Judge(xx,yy))return true;
if(mark[xx][yy])continue;
if(dfs(xx,yy))return true;
}
return false;
} bool Check()
{
for(int i = ; i <(int)Pos.size(); i++){
Pair pp = Pos[i];
memset(mark, false, sizeof(mark));
int xx = pp.first, yy = pp.second;
if(!dfs(xx,yy))return false;
}
return true;
} string Dir="ENSW";
map<vector<Pair >, string >mp;
queue<vector<Pair > >que; void bfs()
{
mp.clear();
while(!que.empty())que.pop();
mp[Pos]="";
que.push(Pos);
while(!que.empty()){
vector<Pair >q, p = que.front();
que.pop();
if((int)p.size() == ){
cout << mp[p] << endl;
return ;
}
for(int i = ; i < ; i++){
q.clear();
for(int j = ; j <(int)p.size(); j++){
Pair pp = p[j];
int xx = next[pp.first][pp.second][i][];
int yy = next[pp.first][pp.second][i][];
if(!Judge(xx,yy))continue;
q.push_back(make_pair(xx,yy));
}
sort(q.begin(), q.end());
q.erase(unique(q.begin(),q.end()),q.end());
if(mp.find(q) == mp.end()){
mp[q] = mp[p] + Dir[i];
que.push(q);
}
}
}
puts("Impossible");
} int main()
{
int _case,t=;
scanf("%d", &_case);
while(_case--){
Pos.clear();
scanf("%d %d", &n, &m);
for(int i = ; i <= n; i++){
scanf("%s", Map[i] + );
}
for(int i = ; i <= n; i++){
for(int j = ; j <= m; j++){
if(Map[i][j] != '#'){
Pos.push_back(make_pair(i,j));
for(int k = ; k < ; k++){
int x = i, y = j;
while(Judge(x,y)){
if(Map[x][y] == '#'){
x -= dir[k][];
y -= dir[k][];
break;
}
x += dir[k][];
y += dir[k][];
}
next[i][j][k][] = x;
next[i][j][k][] = y;
}
}
}
}
printf("Case %d: ", t++);
if(!Check()){
puts("Impossible");
continue;
}
bfs();
}
return ;
}

loj 1426(dfs + bfs)的更多相关文章

  1. DFS/BFS+思维 HDOJ 5325 Crazy Bobo

    题目传送门 /* 题意:给一个树,节点上有权值,问最多能找出多少个点满足在树上是连通的并且按照权值排序后相邻的点 在树上的路径权值都小于这两个点 DFS/BFS+思维:按照权值的大小,从小的到大的连有 ...

  2. 【DFS/BFS】NYOJ-58-最少步数(迷宫最短路径问题)

    [题目链接:NYOJ-58] 经典的搜索问题,想必这题用广搜的会比较多,所以我首先使的也是广搜,但其实深搜同样也是可以的. 不考虑剪枝的话,两种方法实践消耗相同,但是深搜相比广搜内存低一点. 我想,因 ...

  3. ID(dfs+bfs)-hdu-4127-Flood-it!

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=4127 题目意思: 给n*n的方格,每个格子有一种颜色(0~5),每次可以选择一种颜色,使得和左上角相 ...

  4. [LeetCode] 130. Surrounded Regions_Medium tag: DFS/BFS

    Given a 2D board containing 'X' and 'O' (the letter O), capture all regions surrounded by 'X'. A reg ...

  5. HDU 4771 (DFS+BFS)

    Problem Description Harry Potter has some precious. For example, his invisible robe, his wand and hi ...

  6. DFS/BFS视频讲解

    视频链接:https://www.bilibili.com/video/av12019553?share_medium=android&share_source=qq&bbid=XZ7 ...

  7. POJ 3083 -- Children of the Candy Corn(DFS+BFS)TLE

    POJ 3083 -- Children of the Candy Corn(DFS+BFS) 题意: 给定一个迷宫,S是起点,E是终点,#是墙不可走,.可以走 1)先输出左转优先时,从S到E的步数 ...

  8. [LeetCode]695. 岛屿的最大面积(DFS/BFS)、200. 岛屿数量(DFS/BFS待做/并差集待做)

    695. 岛屿的最大面积 题目 给定一个包含了一些 0 和 1的非空二维数组 grid , 一个 岛屿 是由四个方向 (水平或垂直) 的 1 (代表土地) 构成的组合.你可以假设二维矩阵的四个边缘都被 ...

  9. POJ2308连连看dfs+bfs+优化

    DFS+BFS+MAP+剪枝 题意:       就是给你一个10*10的连连看状态,然后问你最后能不能全部消没? 思路:      首先要明确这是一个搜索题目,还有就是关键的一点就是连连看这个游戏是 ...

随机推荐

  1. (转)高性能网站架构之缓存篇—Redis集群增删节点

    标签: 高性能架构集群缓存redis 上一篇文章,我们搭建了Redis-cluster集群,这篇博客跟大家讲一下如何在一个运行的集群上增加节点或者删除节点. Redis集群添加节点 首先我们要新建立一 ...

  2. Pywinauto在Windows Twain Driver自动化测试中的应用研究

    摘  要: 以Python为基础,结合对Twain Driver测试工具的具体需求,将Pywinauto引入到Twain Driver的自动化测试中.介绍了Pywinauto的基本概念,通过测试用例说 ...

  3. iOS 关于iphone6 和 iphone6 plus 的适配

    http://www.ui.cn/detail/26980.html 根据上面说的,iphone6 plus的屏幕的编程时的宽度应该是414,我理解的也是这样,但是我用iphone6 plus 模拟器 ...

  4. NoSQL之【MongoDB】学习(二):DML和查询操作说明

    摘要: 操作MongoDB的方法和关系型数据库差别很大,现在对他们进行说明,后期会逐步完善. ##开头表示MySQL** 开头表示MongoDB 创建: Mongodb:文档数据库,擅长存非结构化数据 ...

  5. winrt组件库(包括翻书组件)

    http://www.mindscapehq.com/products/metroelements/controls/book-control-for-winrt 点击“down free trial ...

  6. 如何让ListView的item不可点击

    原文链接:http://blog.csdn.net/zhangfei_jiayou/article/details/6972752 1. 如果是listView的id是使用系统默认的id,如下, 则可 ...

  7. mvc EF

    一:数据库不存在时重新创建数据库 复制内容到剪贴板程序代码 Database.SetInitializer<testContext>(new CreateDatabaseIfNotExis ...

  8. 【python】为什么修改全局的dict变量不用global关键字

    转自:http://my.oschina.net/leejun2005/blog/145911?fromerr=qnPCgI19#OSC_h4_8 为什么修改字典d的值不用global关键字先声明呢? ...

  9. LeetCode 453 Minimum Moves to Equal Array Elements

    Problem: Given a non-empty integer array of size n, find the minimum number of moves required to mak ...

  10. .Net如何在后台设置日期格式,并显示在前台页面上

    其实方法比较老咯,有比这个简单的朋友请留言哈,我的思路是先将数据库中的日期格式读出来,在后台转化成DatetTime类型,然后在使用DateTime的内部方法设置日期格式,代码如下: DateTime ...