题目链接: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. C#之this的使用

    msdn地址: https://msdn.microsoft.com/zh-cn/library/bb383977(v=vs.120).aspx 扩展方法使你能够向现有类型“添加”方法,而无需创建新的 ...

  2. memcpy vs memmove

    [本文连接] http://www.cnblogs.com/hellogiser/p/memcpy_vs_memmove.html [分析] memcpy与memmove的目的都是将N个字节的源内存地 ...

  3. selenium WebDriver 操作高德地图

    String URL="http://www.amap.com/"; WebDriver driver = new FirefoxDriver(profile); driver.g ...

  4. ACM/ICPC 之 "嵌套"队列 -插队(POJ2259)

    这里插队的意思就是排队时遇到熟人则插到其后,否则排到队尾.(这个习惯不太好)(题意) 题目要求我们模拟“插队模型”和队列的入队和出队完成此算法. 由于题目的输入输出很多,此题的查找操作(找到熟人)需要 ...

  5. 6.nodejs权威指南--进程

    1. 进程 var net = require('net'); var cluster = require('cluster'); cluster.setupMaster({ exec:'child. ...

  6. ffmpeg-20160718-git-bin.7z

    官方 2016-07-18 发布的bin,彻底不支持 xp. ESC 退出 0 进度条开关 1 屏幕原始大小 2 屏幕1/2大小 3 屏幕1/3大小 4 屏幕1/4大小 S 下一帧 [ -2秒 ] + ...

  7. Java for LeetCode 215 Kth Largest Element in an Array

    Find the kth largest element in an unsorted array. Note that it is the kth largest element in the so ...

  8. Zookeeper WINDOWS 安装配置

    下载:zookeeper:http://mirrors.hust.edu.cn/apache/zookeeper/zookeeper-3.4.6/zookeeper-3.4.6.tar.gz 解压zo ...

  9. C# 对象深度拷贝

    转载 using System; using System.Collections.Generic; using System.Linq; using System.Reflection; using ...

  10. 迭代器iterator

    现在接着上篇的,写一来标识vector 的元素的对象迭代器iterator: 还是通过具体代码举例: 下面我讲了一个我暑期团队的故事哦~~: #include<iostream> #inc ...