Place the Robots

思路:在任意一个点格子放机器人,那么它所在的行和列被控制了。我们对每一行或每一列连续的空地(草地忽视)称之为块,给每一行和每一列的块标号,

每一行的快与每一列的快相交的话,才有只有一个交点。  我们把交点当边,把行块和列块连接起来。每一个空第都是一条边。详细细节见代码。

  1 #include <iostream>
2 #include <cstdio>
3 #include <cstring>
4 #include <cmath>
5 #include <algorithm>
6 #include <string>
7 #include <vector>
8 #include <set>
9 #include <map>
10 #include <stack>
11 #include <queue>
12 #include <sstream>
13 #include <iomanip>
14 using namespace std;
15 typedef long long LL;
16 const int INF = 0x4fffffff;
17 const double EXP = 1e-5;
18 const int MS = 55;
19 const int SIZE = 100005;
20
21 // data struct
22 char pic[MS][MS];
23 int sx[MS][MS];
24 int sy[MS][MS];
25
26 int x[MS*MS];
27 int y[MS*MS];
28
29 int cx[MS*MS];
30 int cy[MS*MS];
31
32 bool edges[MS*MS][MS*MS];
33 int mark[MS*MS];
34 int nx,ny,kase;
35 int n,m;
36
37 int path(int u)
38 {
39 for(int v=1;v<=ny;v++)
40 {
41 if(edges[u][v]&&!mark[v])
42 {
43 mark[v]=1;
44 if(cy[v]==0||path(cy[v]))
45 {
46 cx[u]=v;
47 cy[v]=u;
48 return 1;
49 }
50 }
51 }
52 return 0;
53 }
54
55 void match()
56 {
57 memset(cx,0,sizeof(cx));
58 memset(cy,0,sizeof(cy));
59 int ans=0;
60 for(int u=1;u<=nx;u++)
61 {
62 if(!cx[u])
63 {
64 memset(mark,0,sizeof(mark));
65 ans+=path(u);
66 }
67 }
68 printf("Case :%d\n%d\n",kase++,ans);
69 }
70
71 int main()
72 {
73 kase=1;
74 int T;
75 scanf("%d",&T);
76 while(T--)
77 {
78 scanf("%d%d",&n,&m);
79 for(int i=0;i<n;i++)
80 scanf("%s",pic[i]);
81 memset(sx,0,sizeof(sx));
82 memset(sy,0,sizeof(sy));
83 int num=0,flag;
84 for(int i=0;i<n;i++)
85 {
86 flag=0;
87 for(int j=0;j<m;j++)
88 {
89 if(pic[i][j]=='o')
90 {
91 if(flag==0)
92 {
93 num++;
94 flag=1;
95 }
96 sx[i][j]=num;
97 }
98 else if(pic[i][j]=='#')
99 flag=0;
100 }
101 }
102 nx=num;
103 num=0;
104 for(int j=0;j<m;j++)
105 {
106 flag=0;
107 for(int i=0;i<n;i++)
108 {
109 if(pic[i][j]=='o')
110 {
111 if(flag==0)
112 {
113 num++;
114 flag=1;
115 }
116 sy[i][j]=num;
117 }
118 else if(pic[i][j]=='#')
119 flag=0;
120 }
121 }
122 ny=num;
123 memset(edges,0,sizeof(edges));
124 for(int i=0;i<n;i++)
125 for(int j=0;j<m;j++)
126 {
127 if(pic[i][j]=='o')
128 edges[sx[i][j]][sy[i][j]]=1;
129 }
130 match();
131 }
132 return 0;
133 }

最新文章

  1. vbs http
  2. (转)CWnd与HWND的区别与转换
  3. Android:改变Activity切换方式
  4. POJ 3080 Blue Jeans (KMP)
  5. Mac电脑手动清理
  6. Excel文件转换为html静态网页
  7. hibernate 数据关联一对多 3.1
  8. js播放器
  9. 【PHP】数据类型转换
  10. android 常用方法集合
  11. Chars模拟弱网测试
  12. 廖雪峰Java7处理日期和时间-3java.time的API-1LocalDateTime
  13. [apr] Apache Portable Runtime
  14. 给 vue项目添加ESLint
  15. PHP 5.6 开启CURL HTTPS 类型
  16. Java CMYK图片转RGB图片(TwelveMonkeys方式)
  17. Logstash使用jdbc_input同步Mysql数据时遇到的空时间SQLException问题
  18. HDS推出HUS中端阵列 文件、块和对象统一存储
  19. STS的安装教程-鹏鹏
  20. MySql存储引擎MyISAM和InnoDB的区别

热门文章

  1. zabbix自带的模板监控mysql
  2. Ansible_编写Playbook文件
  3. C++知识点案例 笔记-4
  4. Java 程序流程控制语句
  5. dd命令详解-(转自dkcndk)
  6. 文字闪烁效果 CSS + HTML
  7. 微星msi B450M+i5-8500+1060成功黑苹果
  8. 使用Jprofiler分析Java项目的内存开销情况并利用强制回收控制内存
  9. 用TVM在硬件平台上部署深度学习工作负载的端到端 IR 堆栈
  10. 端到端TVM编译器(下)