zoukankan      html  css  js  c++  java
  • [POJ2157]Maze(DFS)

    题目链接:http://poj.org/problem?id=2157

    题意:给一张地图,地图里有门和钥匙,想要开门必须集齐所有钥匙。给定起点和终点,问从起点出发能否到达终点。

    爆搜floodfill,每填一次考虑是否到达终点,并且把门都开开,钥匙都拿上,再进行下一次,其实可以不重复200次,备份一下上一次的状态图,再比对floodfill后的与当前的是否不同即可。

     1 #include <algorithm>
     2 #include <iostream>
     3 #include <iomanip>
     4 #include <cstring>
     5 #include <climits>
     6 #include <complex>
     7 #include <cassert>
     8 #include <cstdio>
     9 #include <bitset>
    10 #include <vector>
    11 #include <deque>
    12 #include <queue>
    13 #include <stack>
    14 #include <ctime>
    15 #include <set>
    16 #include <map>
    17 #include <cmath>
    18 using namespace std;
    19 
    20 const int maxn = 22;
    21 const int dx[5] = {1, -1, 0, 0};
    22 const int dy[5] = {0, 0, 1, -1};
    23 int n, m;
    24 int sx, sy;
    25 int kn[6], ck[6];
    26 char G[maxn][maxn], H[maxn][maxn];
    27 bool vis[maxn][maxn];
    28 bool done;
    29 
    30 bool ok(int x, int y) {
    31     return x >= 0 && y >= 0 && x < n && y < m;
    32 }
    33 
    34 void dfs(int x, int y) {
    35     if(done) return;
    36     if(vis[x][y]) return;
    37     vis[x][y] = 1;
    38     for(int i = 0; i < 4; i++) {
    39         int xx = x + dx[i];
    40         int yy = y + dy[i];
    41         if(!ok(xx, yy)) continue;
    42         if(G[xx][yy] == 'X') continue;
    43         if(vis[xx][yy]) continue;
    44         if(G[xx][yy] >= 'A' && G[xx][yy] <= 'E') {
    45             if(ck[G[xx][yy]-'A'] == kn[G[xx][yy]-'A']) {
    46                 G[xx][yy] = '.';
    47                 dfs(xx, yy);
    48             }
    49         }
    50         else if(G[xx][yy] >= 'a' && G[xx][yy] <= 'e') {
    51             ck[G[xx][yy]-'a']++;
    52             G[xx][yy] = '.';
    53             dfs(xx, yy);
    54         }
    55         else if(G[xx][yy] == 'G') {
    56             done = 1;
    57             return;
    58         }
    59         else if(G[xx][yy] == '.') dfs(xx, yy);
    60     }
    61 }
    62 
    63 int main() {
    64     // freopen("in", "r", stdin);
    65     while(~scanf("%d%d",&n,&m)&&n+m) {
    66         memset(kn, 0, sizeof(kn));
    67         memset(ck, 0, sizeof(ck));
    68         memset(G, 0, sizeof(G));
    69         memset(vis, 0, sizeof(vis));
    70         for(int i = 0; i < n; i++) scanf("%s", G[i]);
    71         for(int i = 0; i < n; i++) {
    72             for(int j = 0; j < m; j++) {
    73                 if(G[i][j] >= 'a' && G[i][j] <= 'e') kn[G[i][j]-'a']++;
    74                 if(G[i][j] == 'S') sx = i, sy = j;
    75             }
    76         }
    77         done = 0;
    78         for(int _ = 0; _ < 200; _++) {
    79             memset(vis, 0, sizeof(vis));
    80             dfs(sx, sy);
    81             if(done) break;
    82         }
    83         if(done) puts("YES");
    84         else puts("NO");
    85     }
    86     return 0;
    87 }
  • 相关阅读:
    简明Secure boot介绍
    密码学有什么用?
    mkimage, no such file or dir
    嵌入式系统安全简介
    希尔排序
    jQuery选择器
    css 选择器
    安装 SQL Server 2008 和管理工具 SQL Server 2008 management studio 及相关问题解决
    mac下安装安卓开发环境
    IOS开发小记-内存管理
  • 原文地址:https://www.cnblogs.com/kirai/p/6437978.html
Copyright © 2011-2022 走看看