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:\n", ++cas);
 82         printf ("%d\n", 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 */
时间: 2024-12-06 11:32:35

BFS 2015百度之星初赛2 HDOJ 5254 棋盘占领的相关文章

数学 2015百度之星初赛2 HDOJ 5255 魔法因子

题目传送门 1 /* 2 数学:不会写,学习一下这种解题方式:) 3 思路:设符合条件的数的最高位是h,最低位是l,中间不变的部分为mid,由题意可得到下面的公式(这里对X乘上1e6用a表示,b表示1e6) 4 (h*power+l+mid)*a = (l*power+h+mid)*b 5 可推得:mid = ((h*power+l) * a - (l*power+h) * b) / (a - b); 6 所以可以枚举h,l然后求mid,注意mid的最低位一定是0,因为留出最低位加l或者h 7

LIS 2015百度之星初赛2 HDOJ 5256 序列变换

题目传送门 1 /* 2 LIS(非严格):首先我想到了LIS,然而总觉得有点不对:每个数先减去它的下标,防止下面的情况发生:(转载) 3 加入序列是1,2,2,2,3,这样求上升子序列是3,也就是要修改2个,但是中间的两个2,变化范围又不能超过(1,3) 4 那么这样求的也就不对,但是减掉之后,相当于给中间重复的数留下了修改的空间 5 解释下为什么可以减而保持正确性:因为题目所求时严格递增,假设是2,3, 4,那么变成1, 1, 1,所以在LIS里非严格递增就可以了 6 这也是为什么要在upp

Kruskal 2015百度之星初赛2 HDOJ 5253 连接的管道

题目传送门 1 /* 2 最小生成树(Kruskal):以权值为头,带入两个端点,自然的排序;感觉结构体的并查集很好看 3 注意:题目老头要的是两个农田的高度差,中文水平不好,题意理解成和平均值的高度差! 4 */ 5 #include <cstdio> 6 #include <algorithm> 7 #include <cstring> 8 #include <cmath> 9 #include <vector> 10 #include &l

二分搜索 2015百度之星初赛1 1003 序列变换

题目传送门 1 /* 2 二分搜索:在0-1e6的范围找到最小的max (ai - bi),也就是使得p + 1 <= a[i] + c or a[i] - c 3 比赛时以为是贪心,榨干智商也想不出来:( 4 */ 5 #include <cstdio> 6 #include <algorithm> 7 #include <cstring> 8 #include <cmath> 9 #include <iostream> 10 using

二分查找 2015百度之星初赛1 1001 超级赛亚ACMer

题目传送门 1 /* 2 二分找到不大于m的最大的数,记做p,只要a[p] + k <= a[p+1]就继续 3 注意:特判一下当没有比m小的数的情况:) 4 */ 5 #include <cstdio> 6 #include <cstring> 7 #include <cmath> 8 #include <algorithm> 9 using namespace std; 10 11 typedef long long ll; 12 13 const

2015百度之星初赛2 1005 序列变换(LIS变形)

LIS(非严格):首先我想到了LIS,然而总觉得有点不对:每个数先减去它的下标,防止下面的情况发生:(转载) 3 加入序列是1,2,2,2,3,这样求上升子序列是3,也就是要修改2个,但是中间的两个2,变化范围又不能超过(1,3) 4 那么这样求的也就不对,但是减掉之后,相当于给中间重复的数留下了修改的空间 5 解释下为什么可以减而保持正确性:因为题目所求时严格递增,假设是2,3, 4,那么变成1, 1, 1,所以在LIS里非严格递增就可以了 6 这也是为什么要在upper_bound的位置插入

2015 百度之星初赛 1 2 2015ACM/ICPC亚洲区上海站 codeforces 851

A - 超级赛亚ACMer HDU - 5246 n m k m >=max( a[i] ); m < min(a[i]); 先判断掉 然后就可以找到最接近的 比m小的一个数 往上涨 看是否能行 O(n) #include<stdio.h> #include<string.h> #include<algorithm> #include<string> #include<iostream> #include<math.h>

2015百度之星初赛2 1004 魔法因子(暴力+数学)

Problem Description 有人说:人类是自己一步步进化的,而数学是上帝亲手创造的.度度熊最近也正沉醉于数学之美中,它发现了一种神奇的数字,取名曰:魔法因子. 将因子记为X,如果有一些整数与这些因子做乘法后,结果仍然是整数,同时,结果数字的首位和末位会换交换位置,而其他位置上的数字恰好不变!这时X被认为是一个魔法因子.需要注意的是,用来相乘的这些整数不会含有前导0,但是如果交换的结果有前导0,又恰好是乘法的结果,这时仍然认为X是这个整数的魔法因子.度度熊认为1不是个魔法因子,因为所有

2015 百度之星 初赛1 1001(贪心)

 Problem Description 百小度是一个ACMer,也是一个超级赛亚人,每个ACMer都有一个战斗力,包括百小度.?所谓超级赛亚人的定义,是说如果在对抗中刚好接近极限状态,那就会激发斗志,实力提升.? 具体来说,就是百小度现在要接受一些ACMer的挑战了,这些ACMer有n个人,第i个人的战斗力是a[i]. ?百小度接下来可以自主安排与这n个ACMer的PK顺序,他要想在PK赛中赢过另外一个ACMer,就必须使得自己的战斗力不小于对方(平局情况他会按照百小度字典上的规则把自己排