• BFS 2015百度之星初赛2 HDOJ 5254 棋盘占领


    题目传送门

      1 /*
      2     BFS:先把1的入队,每个1和它相邻的组合后看看能不能使0变1,若有则添加入队,change函数返回改变了多少个0
      3     注意:结果还要加上原来占领的
      4 */
      5 #include <cstdio>
      6 #include <algorithm>
      7 #include <cstring>
      8 #include <cmath>
      9 #include <vector>
     10 #include <queue>
     11 #include <set>
     12 using namespace std;
     13 
     14 const int MAXN = 5e2 + 10;
     15 const int INF = 0x3f3f3f3f;
     16 int a[MAXN][MAXN];
     17 int dx[4] = {-1, -1, 1, 1};
     18 int dy[4] = {-1, 1, -1, 1};
     19 int n, m;
     20 queue<pair<int, int> > Q;
     21 
     22 int change(int x, int y)
     23 {
     24 
     25     int cnt = 0;
     26     for (int i=0; i<4; ++i)
     27     {
     28         int tx = x + dx[i];    int ty = y + dy[i];
     29         if (tx < 1 || tx > n)    continue;
     30         if (ty < 1 || ty > m)    continue;
     31         if (a[tx][ty] == 1)
     32         {
     33              if (i == 0 || i == 2)
     34              {
     35                 if (a[tx][ty+1] == 0)    {a[tx][ty+1] = 1;    ++cnt;    Q.push (make_pair (tx, ty+1));}
     36                 if (a[x][y-1] == 0)    {a[x][y-1] = 1;    ++cnt;    Q.push (make_pair (x, y-1));}
     37              }
     38              else if (i == 1 || i == 3)
     39              {
     40                 if (a[tx][ty-1] == 0)    {a[tx][ty-1] = 1;    ++cnt;    Q.push (make_pair (tx, ty-1));}
     41                 if (a[x][y+1] == 0)    {a[x][y+1] = 1;    ++cnt;    Q.push (make_pair (x, y+1));}
     42              }
     43         }
     44     }
     45 
     46     return cnt;
     47 }
     48 
     49 int BFS(void)
     50 {
     51     int ans = 0;
     52     while (!Q.empty ())
     53     {
     54         int x = Q.front ().first;    int y = Q.front ().second;    Q.pop ();
     55         ans += change (x, y);
     56     }
     57 
     58     return ans;
     59 }
     60 
     61 int main(void)        //2015百度之星初赛2 HDOJ 5254 棋盘占领
     62 {
     63     int t, cas = 0;    scanf ("%d", &t);
     64     while (t--)
     65     {
     66         while (!Q.empty ())    Q.pop ();
     67         scanf ("%d%d", &n, &m);
     68         memset (a, 0, sizeof (a));
     69 
     70         int g;    scanf ("%d", &g);
     71         int cnt = 0;
     72         while (g--)
     73         {
     74             int x, y;    scanf ("%d%d", &x, &y);
     75             if (a[x][y] == 0)
     76             {
     77                 cnt++;    a[x][y] = 1;    Q.push (make_pair (x, y));
     78             }
     79         }
     80 
     81         printf ("Case #%d:
    ", ++cas);
     82         printf ("%d
    ", BFS () + cnt);
     83     }
     84 
     85     return 0;
     86 }
     87 
     88 
     89 
     90 
     91 /*
     92 4
     93 2 2
     94 2
     95 1 1
     96 2 2
     97 3 3
     98 3
     99 1 1
    100 2 3
    101 3 2
    102 2 4
    103 5
    104 1 1
    105 1 1
    106 1 2
    107 1 3
    108 1 4
    109 2 4
    110 2
    111 1 1
    112 2 4
    113 */
    编译人生,运行世界!
  • 相关阅读:
    samtools flags 分解
    epollo
    springaop 执行顺序问题
    java解析String类型的xml
    服务器调用服务器接口之间的抓包
    windows下mysql忘了安装时的root密码
    docker+jenkins+gitlab自动化构建
    influxdb基本操作
    记一次CPU过高排查过程
    dockercompose部署一个可远程连接的容器
  • 原文地址:https://www.cnblogs.com/Running-Time/p/4544521.html
Copyright © 2020-2023  润新知