pid=4775" target="_blank" style="">题目链接:hdu 4775 Infinite Go

题目大意:两个人下围棋,总共走了n步。黑棋和白棋交替走,假设一片棋的上下左右被封死,那么该片棋子就会被吃掉,问说最后黑白棋各剩多少个。

解题思路:比較恶心的模拟题,相邻同样色的棋子要用并查集连接。而且要记录每片棋子还剩的空格数。假设空格数为0的话说明该片棋子被其它颜色围住,则要剔除掉,不且将相邻的位置不同色的棋空格数加1。主要是细节上的问题。

例子

8

7

5 5

4 5

3 5

3 4

4 4

3 3

4 6

18

1 3

1 4

2 2

1 5

2 4

2 3

3 1

3 2

3 5

3 4

4 2

4 3

4 4

1 6

5 3

3 3

1 10

3 3

12

1 2

1 1

2 1

2 2

1 3

3 1

2 3

1 4

3 2

3 3

4 2

2 4

4

1 1

1 2

2 2

2 1

4

2000000000 2000000000

2000000000 1999999999

1999999999 1999999999

1999999999 2000000000

8

1 2

4 1

2 1

4 2

2 3

4 3

3 2

2 2

17

1 3

1 4

2 2

1 5

2 4

2 3

3 1

3 2

3 5

3 4

4 2

4 3

4 4

1 6

5 3

30 30

3 3

17

1 3

1 4

2 2

1 5

2 4

2 3

3 1

3 2

3 5

3 4

4 2

3 3

4 4

1 6

5 3

4 3

100 100

答案

4 2

9 4

6 4

1 2

2 2

4 3

9 4

9 3

#include <cstdio>
#include <cstring>
#include <vector>
#include <map>
#include <queue>
#include <algorithm> using namespace std;
const int maxn = 1e4;
const int INF = 2*1e9+10;
const int dir[4][2] = { {0, 1}, {0, -1}, {1, 0}, {-1, 0} };
typedef pair<int, int> pii; int N, Nw, Nb, X[maxn+5], Y[maxn+5], f[maxn+5], c[maxn+5];
map<pii, int> R; void init () {
scanf("%d", &N); Nw = N / 2;
Nb = N - Nw; R.clear();
for (int i = 0; i < N; i++) {
f[i] = i;
c[i] = 0;
}
} inline int bit (int x) {
return x&1;
} int getfar (int x) {
return f[x] == x ? x : f[x] = getfar(f[x]);
} inline bool isEmpty (int x, int y) {
if (x <= 0 || y <= 0 || x >= INF || y >= INF)
return false;
if (R.count(make_pair(x, y)))
return false;
return true;
} inline int count_empty (pii u) {
int cnt = 0;
for (int i = 0; i < 4; i++) {
int x = u.first + dir[i][0];
int y = u.second + dir[i][1];
if (isEmpty(x, y))
cnt++;
}
return cnt;
} inline void link_board (int x, int y) {
int fx = getfar(x);
int fy = getfar(y); f[fy] = fx;
c[fx] += c[fy];
/**/
c[fx]--;
} int del_board (int col, int x, int y) {
int cnt = 1;
pii u = make_pair(x, y);
queue<pii> que;
que.push(u); f[R[u]] = R[u];
R.erase(u); while (!que.empty()) {
u = que.front();
que.pop(); for (int i = 0; i < 4; i++) {
int p = u.first + dir[i][0];
int q = u.second + dir[i][1]; if (p <= 0 || p >= INF || q <= 0 || q >= INF)
continue; pii v = make_pair(p, q);
if (!R.count(v))
continue; int set = R[v]; if (bit(set) != col) {
int k = getfar(set);
c[k]++;
continue;
} f[R[v]] = R[v];
R.erase(v);
cnt++;
que.push(v);
}
}
return cnt;
} void del_empty (int k) {
int fk = getfar(k);
c[fk]--; if (c[fk] == 0) {
int set = bit(fk);
int cnt = del_board(set, X[fk], Y[fk]);
if (set)
Nw -= cnt;
else
Nb -= cnt;
}
} void solve () { for (int i = 0; i < N; i++) {
scanf("%d%d", &X[i], &Y[i]);
pii v = make_pair(X[i], Y[i]);
c[i] = count_empty(v);
R[v] = i; for (int j = 0; j < 4; j++) {
int p = X[i] + dir[j][0];
int q = Y[i] + dir[j][1]; if (p <= 0 || q <= 0 || p >= INF || q >= INF)
continue; pii u = make_pair(p, q);
if (!R.count(u))
continue; int k = R[u];
if (bit(i) == bit(k))
link_board(i, k);
else
del_empty(k);
} int fi = getfar(i);
if (c[fi] == 0) {
int cnt = del_board(bit(fi), X[fi], Y[fi]);
if (bit(fi))
Nw -= cnt;
else
Nb -= cnt;
}
}
printf("%d %d\n", Nb, Nw);
} int main () {
int cas;
scanf("%d", &cas);
while (cas--) {
init();
solve();
}
return 0;
}

hdu 4775 Infinite Go(暴力)的更多相关文章

  1. hdu 5461 Largest Point 暴力

    Largest Point Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://acm.hdu.edu.cn/showproblem.php?pid= ...

  2. hdu 5762 Teacher Bo 暴力

    Teacher Bo 题目连接: http://acm.hdu.edu.cn/showproblem.php?pid=5762 Description Teacher BoBo is a geogra ...

  3. HDU 1333 基础数论 暴力

    定义一种数位simth数,该数的各位之和等于其所有质因子所有位数字之和,现给出n求大于n的最小该种数,n最大不超过8位,那么直接暴力就可以了. /** @Date : 2017-09-08 14:12 ...

  4. HDU 4618 Palindrome Sub-Array 暴力

    Palindrome Sub-Array 题目连接: http://acm.hdu.edu.cn/showproblem.php?pid=4618 Description A palindrome s ...

  5. HDU 2089 不要62 | 暴力(其实是个DP)

    题目: http://acm.hdu.edu.cn/showproblem.php?pid=2089 题解: 暴力水过 #include<cstdio> #include<algor ...

  6. hdu 3689 Infinite monkey theorem

    Infinite monkey theorem Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/ ...

  7. HDU 6115 Factory LCA,暴力

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6115 题意:中文题面 分析:直接维护LCA,然后暴力枚举集合维护答案即可. #include < ...

  8. HDU 5636 Shortest Path 暴力

    Shortest Path 题目连接: http://acm.hdu.edu.cn/showproblem.php?pid=5636 Description There is a path graph ...

  9. hdu 3624 City Planning(暴力,也可扫描线)

    City Planning Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) To ...

随机推荐

  1. mongoDB global,startUplog

    1,show logs (Ruiy看到一些人干些事就跟拉shit一样(磨叽),就来气,娃儿的,还不知所谓,抱怨,叫器一大堆!!!,喝喝,就这它还三心二意学一个故事中的主人公小小明上课偷打`皮卡`玩,三 ...

  2. [Ruby学习总结]Ruby中的类

    1.类名的定义以大写字母开头,单词首字母大写,不用"_"分隔 2.实例化对象的时候调用new方法,实际上调用的是类里边的initialize方法,是ruby类的初始化方法,功能等同 ...

  3. go 学习笔记 - sublime text 环境配置

    园里已经有了一篇相当不错的配置说明文章,只是现在gosublime不再支持2.x.文章里的操作在sublimetext3 里一样可以使用 文章地址 : http://www.cnblogs.com/s ...

  4. 走进C++程序世界------继承和派生

    继承和派生 继承是面向对象编程语言的最重要方面之一,正确的使用继承可编写出设计良好,容易于维护和扩展的应用程序.下面是在其他博客中的总结: ****************************** ...

  5. 关于C++中的拷贝构造函数和赋值函数

    如果类定义的数据成员中存在指针或引用,那么最好重载这两个函数. 1.     定义 拷贝构造函数的定义格式:构造函数名(const 源类名& 引用对象形参名){} 赋值函数定义格式:源类名 & ...

  6. R学习笔记

    把学习过程记载下来,加深印象,到时要是忘了也容易查,有需要的同学也可以参考: 1.包的安装:两种方法:一种通过R的菜单,先设定cran镜像,然后安装程序包,会出来一个列表,选择相应程序包安装,安装完毕 ...

  7. git使用图解

    使用前 安装git 配置name 和 email git config --global user.name "Your Name" git config --global use ...

  8. Java - 泛型 ( Generic )

    Java - 泛型 ( Generic )     > 泛型的特点         > 解决元素存储的安全性问题         > 解决获取数据元素时,需要类型强转的问题     ...

  9. 类 的继承性(Inherits)与 重写(Overrides)

    (类) 与 (结构) 类似,让我们可以定义并封装成一组相关项的数据类型.比如封装成结构,那么这个封装包的数据类型就为值类型:如封装成类,那么这个封装包的数据类型就为引用类型. 然而与结构的一个重要区别 ...

  10. MyBatis 注解

    注解 目标 相对应的 XML 描述 @CacheNamespace 类 <cache> 为给定的命名空间 (比如类) 配置缓存. 属性:implemetation,eviction, fl ...