zoukankan      html  css  js  c++  java
  • bzoj 1295 1295: [SCOI2009]最长距离

    思路:对于每个点出发bfs做一次dp, dp[ i ][ j ][ k ] 表示从枚举的该点能不能经过k个障碍物到达(i , j)。

     1 #include<bits/stdc++.h>
     2 #define LL long long
     3 #define ll long long
     4 #define fi first
     5 #define se second
     6 #define mk make_pair
     7 #define pii pair<int,int>
     8 #define piii pair<int, pair<int,int> >
     9 
    10 using namespace std;
    11 
    12 const int N = 30;
    13 const int inf = 0x3f3f3f3f;
    14 const LL INF = 0x3f3f3f3f3f3f3f3f;
    15 const int mod = 1e9 + 7;
    16 const int Mod = 2009;
    17 
    18 int dx[] = {0, 0, 1, -1}, dy[] = {1, -1, 0, 0};
    19 bool dp[N][N][31];
    20 int s[N][N];
    21 int n, m, t;
    22 
    23 bool check(int x, int y) {
    24     if(x < 0 || x >= n) return false;
    25     if(y < 0 || y >= m) return false;
    26     return true;
    27 }
    28 
    29 void bfs(int sx, int sy) {
    30     queue<piii> que;
    31     if(s[sx][sy]) {
    32         que.push(mk(1, mk(sx, sy)));
    33         dp[sx][sy][1] = true;
    34     } else {
    35         que.push(mk(0, mk(sx, sy)));
    36         dp[sx][sy][0] = true;
    37     }
    38 
    39     while(!que.empty()) {
    40         piii u = que.front(); que.pop();
    41         int x = u.se.fi, y = u.se.se, w = u.fi;
    42         for(int i = 0; i < 4; i++) {
    43             int nx_x = x + dx[i], nx_y = y + dy[i];
    44             if(check(nx_x, nx_y)) {
    45                 int nx_w = w + s[nx_x][nx_y];
    46                 if(nx_w <= t && !dp[nx_x][nx_y][nx_w]) {
    47                     que.push(mk(nx_w, mk(nx_x, nx_y)));
    48                     dp[nx_x][nx_y][nx_w] = true;
    49                 }
    50             }
    51         }
    52     }
    53 }
    54 int main() {
    55     scanf("%d%d%d", &n, &m, &t);
    56     for(int i = 0; i < n; i++)
    57         for(int j = 0; j < m; j++)
    58             scanf("%1d", &s[i][j]);
    59 
    60     int ans = 0;
    61     for(int i = 0; i < n; i++) {
    62         for(int j = 0; j < m; j++) {
    63             memset(dp, false, sizeof(dp));
    64             bfs(i, j);
    65             for(int u = 0; u < n; u++) {
    66                 for(int v = 0; v < m; v++) {
    67                     for(int k = 0; k <= t; k++) {
    68                         if(dp[u][v][k]) {
    69                             ans = max(ans, (i - u) * (i - u) + (j - v) * (j - v));
    70                             break;
    71                         }
    72                     }
    73                 }
    74             }
    75         }
    76     }
    77 
    78     printf("%.6f
    ", sqrt(ans));
    79     return 0;
    80 }
    81 
    82 /*
    83 */
  • 相关阅读:
    写简单游戏,学编程语言-python篇
    RSS阅读器python实现概述
    python简易爬虫来实现自动图片下载
    SQL SERVER 2008 R2 SP3 发布
    动态规划问题总结 (转载)
    typedef with const 联合的说明
    C++ 初始化列表
    C++de构造函数
    排序算法温习
    java中读取properties配置文件用例
  • 原文地址:https://www.cnblogs.com/CJLHY/p/9089232.html
Copyright © 2011-2022 走看看