1368 黑白棋
题目来源: TopCoder
基准时间限制:1 秒 空间限制:131072 KB 分值: 160 难度:6级算法题

 收藏
 取消关注

有一个N*M的棋盘(1<=N,M<=50),棋盘上有一些黑色的和白色的棋子。定义棋盘上两个位置相邻是指这两个格子存在公共边。已知棋盘中的白色棋子都不与其他白色棋子相邻。现在玩家可以向棋盘中空格的位置上放入一些黑色棋子,当一个白色棋子相邻的格子都被黑色的棋子占据的时候,这颗白色的棋子会被移出棋盘,而它原来的位置将变为空格,值得注意的是一些边界上的白色棋子其相邻的格子可能不足4个,但是只要这些格子里都是黑色,它就得移除。玩家的目的是放一些黑色的棋子后使棋盘上的空格最大化。求最优策略下棋盘上最多能有多少个空格?(空格指没有棋子的格子。)
Input
多组测试数据,第一行一个整数T,表示测试数据数量,1<=T<=5
每组测试数据有相同的结构构成:
每组数据的第一行有两个整数N,M,表示棋盘的大小,其中1<=N,M<=50.
之后有一个N*M的字符矩阵S,表示棋盘初始状态,其中S[i][j]='.'表示(i,j)格式空的,S[i][j]='x'表示这个格子中有一个黑棋,S[i][j]='o'表示这个格子中有一个白棋。保证任意两颗白棋不相邻。
Output
每组数据一行输出,即棋盘上最多可能出现多少个空格.
Input示例
3
3 3
o.o
.o.
o.o
3 3
...
.o.
...
5 5
xxxxx
xxoxx
xo.ox
xxoxx
xxxxx
Output示例
5
8
4

二分图,将相邻的白棋和空格建边,求两者的最大匹配。最终结果是白棋的数量+空格的数量-匹配的数量。

代码:

#include <iostream>
#include <algorithm>
#include <cmath>
#include <vector>
#include <string>
#include <cstring>
#include <map>
#pragma warning(disable:4996)
using namespace std;int n, m;
int v1, v2;
int link[2502];
int visit[2502];
char val[52][52];
int grid[2502][2502];map<int, int>white;
map<int, int>blank;bool bfs(int x)
{int i;for (i = v2; i >= 1; i--){if (grid[x][i] && visit[i] == 0){visit[i] = 1;if (link[i] == -1 || bfs(link[i])){link[i] = x;return true;}}}return false;
}void Magyarors()
{int i, sum;memset(link, -1, sizeof(link));sum = 0;for (i = v1; i >= 1; i--){memset(visit, 0, sizeof(visit));if (bfs(i)){sum++;}}cout << v1+v2-sum << endl;
}int main()
{//freopen("i.txt","r",stdin);//freopen("o.txt","w",stdout);int test, i, j, num_w, num_b, pos_w, pos_b;cin >> test;while (test--){memset(grid, 0, sizeof(grid));memset(val, 0, sizeof(val));white.clear();blank.clear();num_w = 0;num_b = 0;cin >> n >> m;for (i = 1; i <= n; i++){cin >> val[i] + 1;for (j = 1; j <= m; j++){if (val[i][j] == 'o'){white[i*m + j] = ++num_w;}if (val[i][j] == '.'){blank[i*m + j] = ++num_b;}}}v1 = num_w;v2 = num_b;for (i = 1; i <= n; i++){for (j = 1; j <= m; j++){if (val[i][j] == 'o'){pos_w = white[i*m + j];if (val[i - 1][j] == '.'){pos_b = blank[(i - 1)*m + j];grid[pos_w][pos_b] = 1;}if (val[i + 1][j] == '.'){pos_b = blank[(i + 1)*m + j];grid[pos_w][pos_b] = 1;}if (val[i][j + 1] == '.'){pos_b = blank[i*m + j + 1];grid[pos_w][pos_b] = 1;}if (val[i][j - 1] == '.'){pos_b = blank[i*m + j - 1];grid[pos_w][pos_b] = 1;}}}}Magyarors();}//system("pause");return 0;
}

版权声明:本文为博主原创文章,未经博主允许不得转载。

转载于:https://www.cnblogs.com/lightspeedsmallson/p/4928105.html

51nod 1368:黑白棋 二分图最大匹配相关推荐

  1. 51nod 2006 飞行员配对(二分图最大匹配) 裸匈牙利算法 求二分图最大匹配题

    题目: 题目已经说了是最大二分匹配题, 查了一下最大二分匹配题有两种解法, 匈牙利算法和网络流. 看了一下觉得匈牙利算法更好理解, 然后我照着小红书模板打了一遍就过了. 匈牙利算法:先试着把没用过的左 ...

  2. HDU - 1528 Card Game Cheater(二分图最大匹配)

    题目链接:点击查看 题目大意:题意有点像求田忌赛马的最优解,大概意思就是现在有两个人,每个人都有n张不同的扑克牌,扑克牌的大小首先以点数来确定,点数相同的情况下以花色来决定,红桃(Heart)> ...

  3. 二分图判断以及二分图最大匹配

    概念 二分图又称作二部图 ,是图论中的一种特殊模型. 设G=(V,E)是一个无向图,如果顶点V可分割为两个互不相交的子集(A,B),并且图中的每条边(i,j)所关联的两个顶点i和j分别属于这两个不同的 ...

  4. 【网络流24题】解题报告:A、飞行员配对方案问题(最大流求二分图最大匹配)

    A.飞行员配对方案问题 (二分图最大匹配)(最大流)[提高+/省选- ] 题目链接 [问题分析] 二分图最大匹配问题. [建模方法] 在二分图的基础上增加源S和汇T. 1.S向X集合中每个顶点连一条容 ...

  5. 《算法竞赛入门经典》习题4-3 黑白棋(Othello, ACM、ICPC World Finals 1992, UVa220)

    原题及翻译 Othello is a game played by two people on an 8 x 8 board, using disks that are white on one si ...

  6. 【模板】匈牙利算法 二分图最大匹配题模板

    [任务] 给定一个二分图,用匈牙利算法求这个二分图的最大匹配数. [说明] 求最大匹配,那么我们希望每一个在左边的点都尽量找到右边的一个点和它匹配. 我们一次枚举左边的点x的所有出边指向的点y, 若y ...

  7. 2021牛客多校3 - Minimum grid(二分图最大匹配-最大流)

    题目链接:点击查看 题目大意:给出一个 n∗nn*nn∗n 的棋盘,其中有 mmm 个位置是需要填数字的位置,每个位置需要填 [0,k][0,k][0,k] 的数字中的其中一个,可以重复,现在给出每一 ...

  8. HDU - 1054 Strategic Game(最小点覆盖-二分图最大匹配)

    题目链接:点击查看 题目大意:给出一棵树,现在要在节点上放置士兵,每个士兵可以监视与其所在的节点直接相连的节点,问最少需要多少个士兵才能将整棵树都监视到 题目分析:求最少的节点,以保证每条边都有一个端 ...

  9. HDU - 2389 Rain on your Parade(Hopcroft-Krap算法求二分图最大匹配)

    题目链接:点击查看 题目大意:给出n个人和m个雨伞,t分钟后就要下雨了,现在给出每个人的坐标和速度,以及雨伞所在的坐标,每个雨伞只能容纳一个人,题目问最多有多少个人能不被淋到 题目分析:二分图最大匹配 ...

最新文章

  1. Windows 10如何禁用Microsoft Edge标签页预览
  2. python3.6.0怎么安装pip_python3.6环境安装+pip环境配置教程图文详解
  3. springboot使用定时器及发送邮件
  4. 以无代码的方式将Form打印内容转成生成PDF文件
  5. 2 0 2 0 年 第 十 一 届 蓝 桥 杯 - 省赛 - CC++大学B组 - B.既约分数
  6. [道理]关于人生的,很不错!
  7. 数据结构与算法之美-排序(下)
  8. linux查看主机硬件命令
  9. Spring 的循环依赖:真的必须非要三级缓存吗?
  10. 编辑距离 在输入检测中的应用
  11. 判断一个整数是否为2的方幂
  12. ssh连接docker容器
  13. 【信号处理】采样定理的深入浅出
  14. sipp uas 脚本
  15. 中国出口印度尼西亚主要商品
  16. 变更日志 批准的变更请求 收尾流程 原型法 名义小组 习题
  17. java.lang.ClassCastException: Ljava.lang.Object; cannot be cast to com.entity.Advertisem异常
  18. 02-Hadoop集群搭建
  19. c++语言设计五子棋游戏,C++实现五子棋游戏
  20. #ifndef #define #endif的作用

热门文章

  1. oracle之alter学习笔记
  2. MWC2018:阿里云发布8款云计算AI产品,中国科技已领先世界一步
  3. 【Kafka】Kafka-数据倾斜问题-参考资料-解决方案
  4. 141. Linked List Cycle
  5. NetScaler的部署实验之二NetScaler的传输环路值的设定
  6. 【笔记】mysql入门语句8条
  7. .net采集网页方法大全(5种)
  8. 迪杰斯特拉算法——PAT 1003
  9. UVA 11983 Weird Advertisement
  10. GraphQL 渐进学习 07-graphql-node-server-模块化