zoukankan      html  css  js  c++  java
  • Good Bye 2016 D. New Year and Fireworks BFS

    D. New Year and Fireworks

    链接:

    http://codeforces.com/contest/750/problem/D

    题解:

    vis[i][j][k][l]用来记录在 (i,j)这个点在 第k次爆炸中 在l方向 有没有被访问过

    访问过就continue 这样就不会超时了 其他的就是bfs了

    代码:

     1 #include <map>
     2 #include <set>
     3 #include <cmath>
     4 #include <queue>
     5 #include <stack>
     6 #include <cstdio>
     7 #include <string>
     8 #include <vector>
     9 #include <cstring>
    10 #include <iostream>
    11 #include <algorithm>
    12 #include <functional>
    13 using namespace std;
    14 #define rep(i,a,n) for (int i=a;i<=n;i++)
    15 #define per(i,a,n) for (int i=n;i>=a;i--)
    16 #define pb push_back
    17 #define mp make_pair
    18 #define all(x) (x).begin(),(x).end()
    19 #define fi first
    20 #define se second
    21 #define SZ(x) ((int)(x).size())
    22 typedef vector<int> VI;
    23 typedef long long ll;
    24 typedef pair<int, int> PII;
    25 const ll mod = 1e9 + 7;
    26 const int inf = 0x3f3f3f3f;
    27 const double eps = 1e-7;
    28 // head
    29 
    30 struct Point {
    31     int x, y;
    32     int i;
    33     int dir;
    34 };
    35 map<PII, int> mm; 
    36 int vis[400][400][40][8];
    37 int dx[8] = { 1, 1, 0, -1, -1, -1, 0, 1 };
    38 int dy[8] = { 0, 1, 1, 1, 0, -1, -1, -1 };
    39 int n;
    40 int t[50];
    41 int ans;
    42 
    43 void bfs() {
    44     rep(i, 0, t[1] - 1) mm[PII(200, 200 + i)] = 1;
    45     ans += t[1];
    46     queue<Point> mq;
    47     Point k;
    48     k.x = 200, k.y = 200 + t[1] - 1, k.i = 1, k.dir = 2;
    49     mq.push(k);
    50     while (!mq.empty()) {
    51         k = mq.front();
    52         mq.pop();
    53         if (k.i == n) continue;
    54         if (vis[k.x][k.y][k.i][k.dir]) continue;
    55         else vis[k.x][k.y][k.i][k.dir] = 1;
    56         Point p = k;
    57         int d = (k.dir + 7) % 8;
    58         rep(i, 1, t[k.i + 1]) {
    59             p.x += dx[d];
    60             p.y += dy[d];
    61             if (!mm[PII(p.x, p.y)]) mm[PII(p.x, p.y)] = 1, ans++;
    62         }
    63         p.i++;
    64         p.dir = d;
    65         mq.push(p);
    66         p = k;
    67         d = (k.dir + 1) % 8;
    68         rep(i, 1, t[k.i + 1]) {
    69             p.x += dx[d];
    70             p.y += dy[d];
    71             if (!mm[PII(p.x, p.y)]) mm[PII(p.x, p.y)] = 1, ans++;
    72         }
    73         p.i++;
    74         p.dir = d;
    75         mq.push(p);
    76     }
    77 }
    78 
    79 int main() {    
    80     cin >> n;
    81     rep(i, 1, n) cin >> t[i];
    82     bfs();
    83     cout << ans << endl;
    84     return 0;
    85 }
  • 相关阅读:
    Java equals()和hashCode()重写总结
    常见ORM框架理解
    struts2的第一个小页面
    Java开发StringBuilder类
    “中软综合项目实训”——把学生当员工培养
    中软寻梦
    软件开发学习的5大技巧
    从学生心理入手
    IT技术人员的职业发展方向
    驱动创新 引领未来
  • 原文地址:https://www.cnblogs.com/baocong/p/6472058.html
Copyright © 2011-2022 走看看