loj 1426(dfs + bfs)

来源:互联网 发布:java图书管理系统教程 编辑:程序博客网 时间:2024/06/04 18:10

题目链接: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,那么说明找到了这样的指令可以是所有的"*"都能按照这样的指令到达边界。

  1 #include <iostream>  2 #include <cstdio>  3 #include <cstring>  4 #include <algorithm>  5 #include <vector>  6 #include <queue>  7 #include <string>  8 #include <map>  9 using namespace std; 10  11 const int MAXN = 14; 12 typedef pair<int,int >Pair; 13  14 char Map[MAXN][MAXN]; 15 int n,m; 16 int dir[4][2] = { {0,1},{-1,0},{1,0},{0,-1} }; 17 vector<Pair >Pos; 18 int next[MAXN][MAXN][4][2]; 19 bool Judge(int x, int y) 20 { 21     if(x >= 1&&x <= n&&y >= 1&&y <=m) 22         return true; 23     return false; 24 } 25 bool mark[MAXN][MAXN]; 26 bool dfs(int x, int y) 27 { 28     mark[x][y] = true; 29     for(int i = 0; i < 4; i++){ 30         int xx = next[x][y][i][0]; 31         int yy = next[x][y][i][1]; 32         if(!Judge(xx,yy))return true; 33         if(mark[xx][yy])continue; 34         if(dfs(xx,yy))return true; 35     } 36     return false; 37 } 38  39 bool Check() 40 { 41     for(int i = 0; i <(int)Pos.size(); i++){ 42         Pair pp = Pos[i]; 43         memset(mark, false, sizeof(mark)); 44         int xx = pp.first, yy = pp.second; 45         if(!dfs(xx,yy))return false; 46     } 47     return true; 48 } 49  50 string Dir="ENSW"; 51 map<vector<Pair >, string >mp; 52 queue<vector<Pair > >que; 53  54 void bfs() 55 { 56     mp.clear(); 57     while(!que.empty())que.pop(); 58     mp[Pos]=""; 59     que.push(Pos); 60     while(!que.empty()){ 61         vector<Pair >q, p = que.front(); 62         que.pop(); 63         if((int)p.size() == 0){ 64             cout << mp[p] << endl; 65             return ; 66         } 67         for(int i = 0; i < 4; i++){ 68             q.clear(); 69             for(int j = 0; j <(int)p.size(); j++){ 70                 Pair pp = p[j]; 71                 int xx = next[pp.first][pp.second][i][0]; 72                 int yy = next[pp.first][pp.second][i][1]; 73                 if(!Judge(xx,yy))continue; 74                 q.push_back(make_pair(xx,yy)); 75             } 76             sort(q.begin(), q.end()); 77             q.erase(unique(q.begin(),q.end()),q.end()); 78             if(mp.find(q) == mp.end()){ 79                 mp[q] = mp[p] + Dir[i]; 80                 que.push(q); 81             } 82         } 83     } 84     puts("Impossible"); 85 } 86  87 int main() 88 { 89     int _case,t=1; 90     scanf("%d", &_case); 91     while(_case--){ 92         Pos.clear(); 93         scanf("%d %d", &n, &m); 94         for(int i = 1; i <= n; i++){ 95             scanf("%s", Map[i] + 1); 96         } 97         for(int i = 1; i <= n; i++){ 98             for(int j = 1; j <= m; j++){ 99                 if(Map[i][j] != '#'){100                     Pos.push_back(make_pair(i,j));101                     for(int k = 0; k < 4; k++){102                         int x = i, y = j;103                         while(Judge(x,y)){104                             if(Map[x][y] == '#'){105                                 x -= dir[k][0];106                                 y -= dir[k][1];107                                 break;108                             }109                             x += dir[k][0];110                             y += dir[k][1];111                         }112                         next[i][j][k][0] = x;113                         next[i][j][k][1] = y;114                     }115                 }116             }117         }118         printf("Case %d: ", t++);119         if(!Check()){120             puts("Impossible");121             continue;122         }123         bfs();124     }125     return 0;126 }127 128 129         
View Code

 

0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 被眼镜王蛇咬了怎么办 被黄蜂蛰了怎么办消肿 被黑色黄蜂蜇了怎么办 手指被黄蜂蛰了怎么办 被马蜂蛰了肿了怎么办 给青竹蛇咬了怎么办 被青竹蛇咬了怎么办 孕早期吃了桂皮怎么办? 怀孕后吃了八角怎么办 孕妇吃了点八角怎么办 煮粥老是溢出来怎么办 6个月的小孩咳嗽怎么办 10个月婴儿咳嗽怎么办 6个月婴儿感冒了怎么办 六个月宝宝有痰怎么办 9月婴儿牛奶过敏怎么办 一用粉底就过敏怎么办 7个月婴儿过敏怎么办 9个月宝宝腹泻怎么办 9个月宝宝拉肚子怎么办 5个月宝宝拉肚子怎么办 九个月大宝宝拉肚子怎么办 九个半月的宝宝拉肚子怎么办 9个月婴儿拉稀怎么办 九个月的宝宝拉肚子怎么办 9个月宝宝拉稀水怎么办 2岁宝宝腹泻拉水怎么办 18个月宝宝拉水怎么办 2个月宝宝拉稀水怎么办 2个月的宝宝腹泻怎么办 2个月的宝宝拉稀怎么办 宝宝不喝补液盐怎么办 4个月宝宝腹泻怎么办 6个月宝宝腹泻怎么办 四个月的宝宝拉肚子怎么办 7个月婴儿便秘怎么办 宝宝9个月拉肚子怎么办 2个月宝宝拉肚子怎么办 4个月宝宝没奶怎么办 宝宝又吐又拉怎么办 冬季车放在外面怎么办