loj 1426(dfs + bfs)
题目链接: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)的更多相关文章
- DFS/BFS+思维 HDOJ 5325 Crazy Bobo
题目传送门 /* 题意:给一个树,节点上有权值,问最多能找出多少个点满足在树上是连通的并且按照权值排序后相邻的点 在树上的路径权值都小于这两个点 DFS/BFS+思维:按照权值的大小,从小的到大的连有 ...
- 【DFS/BFS】NYOJ-58-最少步数(迷宫最短路径问题)
[题目链接:NYOJ-58] 经典的搜索问题,想必这题用广搜的会比较多,所以我首先使的也是广搜,但其实深搜同样也是可以的. 不考虑剪枝的话,两种方法实践消耗相同,但是深搜相比广搜内存低一点. 我想,因 ...
- ID(dfs+bfs)-hdu-4127-Flood-it!
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=4127 题目意思: 给n*n的方格,每个格子有一种颜色(0~5),每次可以选择一种颜色,使得和左上角相 ...
- [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 ...
- HDU 4771 (DFS+BFS)
Problem Description Harry Potter has some precious. For example, his invisible robe, his wand and hi ...
- DFS/BFS视频讲解
视频链接:https://www.bilibili.com/video/av12019553?share_medium=android&share_source=qq&bbid=XZ7 ...
- POJ 3083 -- Children of the Candy Corn(DFS+BFS)TLE
POJ 3083 -- Children of the Candy Corn(DFS+BFS) 题意: 给定一个迷宫,S是起点,E是终点,#是墙不可走,.可以走 1)先输出左转优先时,从S到E的步数 ...
- [LeetCode]695. 岛屿的最大面积(DFS/BFS)、200. 岛屿数量(DFS/BFS待做/并差集待做)
695. 岛屿的最大面积 题目 给定一个包含了一些 0 和 1的非空二维数组 grid , 一个 岛屿 是由四个方向 (水平或垂直) 的 1 (代表土地) 构成的组合.你可以假设二维矩阵的四个边缘都被 ...
- POJ2308连连看dfs+bfs+优化
DFS+BFS+MAP+剪枝 题意: 就是给你一个10*10的连连看状态,然后问你最后能不能全部消没? 思路: 首先要明确这是一个搜索题目,还有就是关键的一点就是连连看这个游戏是 ...
随机推荐
- CEF3开发者系列之JS与C++交互之一
JS与Native交互是相对于比较困难的技术,在学习这门技术之前,我们先了解下浏览器内核中的JS引擎与chromium内核的V8引擎相关知识.在浏览器应用中,JS与本地代码互相调用,得益于浏览器内核对 ...
- gtk+-3.21.4 static build step in windows XP
In recent days the weather is very hot Unable to sleep properly Under the state of daze research gtk ...
- 【Android Studio错误】 If you are behind an HTTP proxy, please configure the proxy settings either in IDE or Gradle.
解决办法:以管理员身份运行cmd窗口,输入命令“netsh winsock reset” netsh winsock reset命令,作用是重置 Winsock 目录.如果一台机器上的Winsock协 ...
- Mathematics:DNA Sorting(POJ 1007)
DNA排序 题目大意:给定多个ACGT序列,按照字母顺序算出逆序数,按逆序数从小到大排列 这题其实很简单,我们只要用一个归并排序算逆序数,然后快排就可以了(插入排序也可以,数据量不大),但是要注意的是 ...
- codeforces 507B. Amr and Pins 解题报告
题目链接:http://codeforces.com/problemset/problem/507/B 题目意思:给出圆的半径,以及圆心坐标和最终圆心要到达的坐标位置.问最少步数是多少.移动见下图.( ...
- 【leetcode】 Generate Parentheses (middle)☆
Given n pairs of parentheses, write a function to generate all combinations of well-formed parenthes ...
- 【linux】find删除指定时间之前的文件
今天磁盘满了,想删掉一些老的日志文件.开始想写个python脚本,转念一想,可能shell脚本好点.结果发现,根本不用写脚本,一个find指令就可以解决问题了. 先上指令 -exec rm {} \; ...
- UIView CALayer 的区别
UIView与CALayer的区别,很详细 研究Core Animation已经有段时间了,关于Core Animation,网上没什么好的介绍.苹果网站上有篇专门的总结性介绍,但是似乎原理性的东西不 ...
- .NET微信公众号开发-1.0初始微信公众号
一.前言 微信公众号是开发者或商家在微信公众平台上申请的应用账号,该帐号与QQ账号互通,通过公众号,商家可在微信平台上实现和特定群体的文字.图片.语音.视频的全方位沟通.互动 .形成了一 种主流的线上 ...
- java中的[Ljava.lang.Object;@2a139a55问题
数据显示为Ljava.lang.Object;@2a139a55问题,是因为你从数据库读出数据后,存入到list集合上时,如果你没有指定要存入的数据的类型,系统会自动给你赋一个object类型,他是所 ...