题意:给定一个N*N的表格,其上有三种类型的方格:坚实的地面、潮湿的区域和保护区。连通的湿区方格形成湿区,当两个正方形共用一条边时,它们被认为是连接的。每个湿区必须连接到网格的左右两侧,并且不包含超过2N的湿区方块。属于两个不同湿区的两个湿区方格之间的距离始终至少为3,距离=abs(x-dx)+abs(y-dy)。你和你的朋友将轮流在湿地旁放置一个摄像头,但有以下限制:1. 摄像机必须放在坚固的地面上。2. 相机必须靠近湿区广场,这样你才能拍到鸟的照片。3. 摄像机不得位于保护区广场上。4. 同一个方格上不能有两个摄像头。5. 同一湿区相邻的两个摄像机不能相邻(相邻的概念意味着共享一个边)。 第一个不能放置相机的玩家将输掉游戏。假设两个玩家都玩得很好,第一个玩家会赢还是输?

输入格式:第一行一个整数N(N <= 10),接下来是一个N*N的字符矩阵,“*”代表湿区方格,‘.’代表坚实的地面,‘x’代表保护区。

输出格式:第一个玩家升输出“First player will win”,否则输出“Second player will win”

分析:思路状压+SG。定义可以放摄像头的地面为可行方格,相邻的可行方格组成的连通块称为可行区。将每个湿区编号,注意到不同湿区方格间曼哈顿距离不小于3,故每个可行方格只与一个湿区相邻,所以一个可行区的摄像头放置情况不会影响其他可行区,所以每个可行区间可看作独立的Nim游戏,用状压分别求出SG值异或起来即可。因为湿区方格不超过2*N,所以可行区的方格数不会超过2*N,复杂度正确。

#include<cstdio>
#include<vector>
#include<cstring>
#define pb(a) push_back(a)
const int maxn = 1e4; //st数组代表该潮湿的方格所属湿区编号,org数组表示该可行方格相邻的湿区编号
int N,tot,cnt,kk,SG;
int sg[2000005],org[12][12],st[12][12],to[4][2] = {{0, 1}, {0, -1}, {-1, 0}, {1, 0}};
char ss[12][12];
bool vis[12][12];
std::vector<int> x[100], y[100]; inline int abs(int a) { return a < 0 ? -a : a; } // 找湿地连通块,对不同连通块进行编号
void dfs(int x, int y){
for(int i = 0; i < 4; ++i){
int dx = x + to[i][0], dy = y + to[i][1];
if(ss[dx][dy] == '*' && !vis[dx][dy]) vis[dx][dy] = 1, st[dx][dy] = st[x][y], dfs(dx, dy);
else if(ss[dx][dy] == '.') org[dx][dy] = st[x][y]; // 确定可行方格所属湿区编号
}
} //存下可行区中各方格坐标
void dfs_(int xx, int yy, int k){
//printf("%d %d\n", xx, yy);
for(int i = 0; i < 4; ++i){
int dx = xx + to[i][0], dy = yy + to[i][1];
if(org[dx][dy] == org[xx][yy] && !vis[dx][dy]){
vis[dx][dy] = 1;
x[k].pb(dx), y[k].pb(dy); //该方格属于第k个可行区
dfs_(dx, dy, k);
}
}
} //now表示当前状压的状态,id表示可行区编号,num表示可行区内方格数
void get_sg(int now, int id, int num){
if(sg[now]) return ;
bool ok, is[maxn];
memset(is, 0, sizeof(is));
for(int i = 0; i < num; ++i){
if((now & (1 << i)) == 0){
ok = 1;
for(int t = 0; t < num; ++t){
if(t == i) continue;
if(abs(x[id][t] - x[id][i]) + abs(y[id][t] - y[id][i]) == 1 && (now & (1 << t))) { ok = 0; break; }
}
if(ok){
get_sg(now | (1 << i), id, num);
is[sg[now | (1 << i)]] = 1;
}
}
}
for(int i = 0; i < maxn; ++i)
if(!is[i]){
sg[now] = i;
return ;
}
} int main(){
scanf("%d", &N);
for(int i = 1; i <= N; ++i) scanf("%s", ss[i]+1);
for(int i = 1; i <= N; ++i)
for(int t = 1; t <= N; ++t)
if(ss[i][t] == '*' && !vis[i][t]){
vis[i][t] = 1, st[i][t] = ++tot, dfs(i, t);
}
for(int i = 1; i <= N; ++i)
for(int t = 1; t <= N; ++t)
if(ss[i][t] == '.' && !vis[i][t] && org[i][t]){
vis[i][t] = 1;
x[++kk].pb(i), y[kk].pb(t);
dfs_(i, t, kk);
}
for(int i = 1; i <= kk; ++i){
memset(sg, 0, sizeof(sg));
get_sg(0, i, x[i].size());
SG ^= sg[0];
}
if(SG) puts("First player will win");
else puts("Second player will win");
return 0;
}

2019-2020 ICPC Southwestern European Regional Programming Contest (SWERC 2019-20) L题(SG+状压)的更多相关文章

  1. Gym 2009-2010 ACM ICPC Southwestern European Regional Programming Contest (SWERC 2009) A. Trick or Treat (三分)

    题意:在二维坐标轴上给你一堆点,在x轴上找一个点,使得该点到其他点的最大距离最小. 题解:随便找几个点画个图,不难发现,答案具有凹凸性,有极小值,所以我们直接三分来找即可. 代码: int n; lo ...

  2. 2016-2017 ACM-ICPC Southwestern European Regional Programming Contest (SWERC 2016) F dfs序+树状数组

    Performance ReviewEmployee performance reviews are a necessary evil in any company. In a performance ...

  3. 2016-2017 ACM-ICPC Southwestern European Regional Programming Contest (SWERC 2016)

    A. Within Arm's Reach 留坑. B. Bribing Eve 枚举经过$1$号点的所有直线,统计直线右侧的点数,旋转卡壳即可. 时间复杂度$O(n\log n)$. #includ ...

  4. 2017-2018 ACM-ICPC Southwestern European Regional Programming Contest (SWERC 2017)

    A. Cakey McCakeFace 按题意模拟即可. #include<stdio.h> #include<iostream> #include<string.h&g ...

  5. 2016-2017 ACM-ICPC Southwestern European Regional Programming Contest (SWERC 2016) B - Bribing Eve

    地址:http://codeforces.com/gym/101174/attachments 题目:pdf,略 思路: 把每个人的(x1,x2)抽象成点(xi,yi). 当1号比i号排名高时有==& ...

  6. 2016-2017 ACM-ICPC Southwestern European Regional Programming Contest (SWERC 2016) D.Dinner Bet 概率DP+排列组合

    题目链接:点这里 题意: 1~N标号的球 现在A有C个,B有C个 每次可以随机得到D个不同的球(1~N);问你A或B中的C个球都出现一次的 期望次数 题解: dp[i][j][k]表示 随机出现了i个 ...

  7. 2016-2017 ACM-ICPC Southwestern European Regional Programming Contest (SWERC 2016) E.Passwords AC自动机+dp

    题目链接:点这里 题意: 让你构造一个长度范围在[A,B]之间 字符串(大小写字母,数字),问你有多少种方案 需要满足条件一下: 1:构成串中至少包含一个数字,一个大写字母,一个小写字母:   2:不 ...

  8. 2017-2018 ACM-ICPC Southeastern European Regional Programming Contest (SEERC 2017)

    2017-2018 ACM-ICPC Southeastern European Regional Programming Contest (SEERC 2017) 全靠 wxh的博客 补完这套.wx ...

  9. 2018-2019 ACM-ICPC Southeastern European Regional Programming Contest (SEERC 2018)

    layout: post title: 2018-2019 ACM-ICPC Southeastern European Regional Programming Contest (SEERC 201 ...

  10. 2018-2019 ACM-ICPC Nordic Collegiate Programming Contest (NCPC 2018)-E. Explosion Exploit-概率+状压dp

    2018-2019 ACM-ICPC Nordic Collegiate Programming Contest (NCPC 2018)-E. Explosion Exploit-概率+状压dp [P ...

随机推荐

  1. 【opencv】传统图像识别:hog+svm行人识别实战

    实战工具:python3.7+pycharm+opencv4.6算法知识:HOG特征提取.SVM模型构建实战目的:本次实战的目的是熟悉HOG+SVM工作流算法,初步掌握图像分类的传统算法.实战记录:本 ...

  2. 在原生APP中集成Unity容器

    随着技术的发展,越来越多的APP期望拥有3D,AR的能力.要达到这个目标可以选择使用原生开发,也可以使用Unity成熟的3D开发技术链,通过嵌入的方式将Unity容器嵌入到APP中.这里介绍的是通过嵌 ...

  3. Ascend C保姆级教程:我的第一份Ascend C代码

    本文分享自华为云社区<Ascend C保姆级教程:我的第一份Ascend C代码>,作者:昇腾CANN . Ascend C是昇腾AI异构计算架构CANN针对算子开发场景推出的编程语言,原 ...

  4. 利用RATF框架实现web状态的监控

    之前,我们已经说明了如何实现一个我们的接口测试框架RATF,当然这个框架不止可以用于管理我们的接口测试代码,我们还可以用他来对我们的web进行简单粗暴的监控. 原理: 1. 通过使用配置文件,对要监控 ...

  5. chatglm2-6b在P40上做LORA微调

    背景: 目前,大模型的技术应用已经遍地开花.最快的应用方式无非是利用自有垂直领域的数据进行模型微调.chatglm2-6b在国内开源的大模型上,效果比较突出.本文章分享的内容是用chatglm2-6b ...

  6. Go,从命名开始!Go的关键字和标识符全列表手册和代码示例!

    关注TechLeadCloud,分享互联网架构.云服务技术的全维度知识.作者拥有10+年互联网服务架构.AI产品研发经验.团队管理经验,同济本复旦硕,复旦机器人智能实验室成员,阿里云认证的资深架构师, ...

  7. git命令和遇到的问题

    命令 1.快速关联/修改Git远程仓库地址 (1).删除本地仓库当前关联的无效远程地址,再为本地仓库添加新的远程仓库地址 git remote -v //查看git对应的远程仓库地址 git remo ...

  8. Solution -「洛谷 P2000」拯救世界

    Description Link. 概括什么好麻烦哦 w. Solution 生成函数裸题. 把所有情况罗列出来: kkk: 金: \(1+x^6+x^{12}+\dots=\frac{1}{1-x^ ...

  9. Redis系列24:Redis使用规范

    Redis系列1:深刻理解高性能Redis的本质 Redis系列2:数据持久化提高可用性 Redis系列3:高可用之主从架构 Redis系列4:高可用之Sentinel(哨兵模式) Redis系列5: ...

  10. CefSharp自定义滚动条样式

    在WinForm/WPF中使用CefSharp混合开发时,通常需要自定义滚动条样式,以保证应用的整体风格统一.本文将给出一个简单的示例介绍如何自定义CefSharp中滚动条的样式. 基本思路 在前端开 ...