思路

注:上图只是个例子,其实建图时 \(5\) 是不会连向 \(6\) 的

\(Code\)

#include<cstdio>
#include<cstring>
#include<iostream>
using namespace std; int n , m , mp[55][55] , f[55 * 55][4] , tot , vis[55 * 55] , h[55 * 55] , rt; struct edge{
int to , nxt;
}e[55 * 55 * 2]; inline int getid(int x , int y){return (x - 1) * m + y;}
inline void add(int x , int y)
{
e[++tot] = (edge){y , h[x]};
h[x] = tot;
e[++tot] = (edge){x , h[y]};
h[y] = tot;
} inline void dfs(int x)
{
vis[x] = 1;
int mi = 1e7 , sum = 0;
for(register int i = h[x]; i; i = e[i].nxt)
{
int v = e[i].to;
if (vis[v]) continue;
dfs(v);
f[x][0] += f[v][1] , sum += min(min(f[v][0] , f[v][1]) , f[v][2]);
mi = min(mi , f[v][2] - min(min(f[v][0] , f[v][1]) , f[v][2]));
}
f[x][1] = sum + mi , f[x][2] = sum + 1; } struct node{
int i , j;
}d[55 * 55]; inline void bfs(int p , int q)
{
int head = 0 , tail = 1;
node now;
d[tail] = (node){p , q};
vis[getid(p , q)] = 1;
while (head < tail)
{
now = d[++head];
int i = now.i , j = now.j , l = j + 1;
while (mp[i][l] && !vis[getid(i , l)])
d[++tail] = (node){i , l} , vis[getid(i , l)] = 1 , add(getid(i , l) , getid(i , j)) , l++;
l = j - 1;
while (mp[i][l] && !vis[getid(i , l)])
d[++tail] = (node){i , l} , vis[getid(i , l)] = 1 , add(getid(i , l) , getid(i , j)) , l--;
l = i + 1;
while (mp[l][j] && !vis[getid(l , j)])
d[++tail] = (node){l , j} , vis[getid(l , j)] = 1 , add(getid(l , j) , getid(i , j)) , l++;
l = i - 1;
while (mp[l][j] && !vis[getid(l , j)])
d[++tail] = (node){l , j} , vis[getid(l , j)] = 1 , add(getid(l , j) , getid(i , j)) , l--;
}
} int main()
{
scanf("%d%d" , &n , &m);
char s[55];
for(register int i = 1; i <= n; i++)
{
scanf("%s" , s);
for(register int j = 0; j < m; j++)
mp[i][j + 1] = (s[j] == '.' ? 1 : 0);
}
for(register int i = 1; i <= n; i++)
{
int flag = 0;
for(register int j = 1; j <= m; j++)
if (mp[i][j] == 1)
{
int s = 0 , ss = 0;
if (mp[i + 1][j] || mp[i - 1][j]) s = 1;
if (mp[i][j - 1] || mp[i][j + 1]) ss = 1;
if (s && ss);
else rt = getid(i , j) , bfs(i , j) , flag = 1;
if (flag) break;
}
if (flag) break;
}
memset(vis , 0 , sizeof vis);
dfs(rt);
printf("%d" , min(f[rt][1] , f[rt][2]));
}

最新文章

  1. CSS魔法堂:重拾Border之——更广阔的遐想
  2. 《Linux及安全》实践3.2
  3. [DFNews] Blackbag发布MacQuisition 2013 R2
  4. 51nod1069(nim博弈)
  5. JsRender for object 语法说明
  6. 【每日学习】Apache重写未开启,导致The requested URL /xxxx.html was not found on this server
  7. activiti自定义流程之整合(一):整体环境配置
  8. CodeForces Round #278 (Div.2) (待续)
  9. 建立Clojure开发环境-使用IDEA和Leiningen
  10. Android游戏快速入门(一):基础储备
  11. 李洪强iOS开发Swift篇---12_NSThread线程相关简单说明
  12. 深入Java虚拟机:JVM中的Stack和Heap
  13. Android网络开发之OkHttp--基本用法实例化各个对象
  14. 鸟瞰spring
  15. Ubuntu 16.04 + ROS Kinetic 机器人操作系统学习镜像分享与使用安装说明
  16. DWM1000 测距原理简单分析 之 SS-TWR代码分析1 -- [蓝点无限]
  17. 简单聊一聊那些svg的沿路径运动
  18. ES6 字符串
  19. Coprime (单色三角形+莫比乌斯反演(数论容斥))
  20. 【NOIP 2016】Day2 T3 愤怒的小鸟

热门文章

  1. Zabbix与乐维监控对比分析(二)——Agent管理、自动发现、权限管理
  2. Golang反射获得变量类型和值
  3. 4.7:Hive操作实验
  4. 【十次方微服务后台开发】Day02:加密与JWT鉴权、微服务注册中心、配置中心、熔断器、网关、消息总线、部署与持续集成、容器管理与监控Rancher、influxDB、grafana
  5. NGINX的配置和基本使用
  6. [Webcast]Silverlight探秘系列课程
  7. 定制.NET 6.0的Middleware中间件
  8. python循环结构之for循环
  9. pymysql.err.ProgrammingError: (1146, &quot;Table &#39;autoplatform.webcasestepinfo&#39; doesn&#39;t exist&quot;
  10. 用了这么多年的 SpringBoot 你知道什么是 SpringBoot 的 Web 类型推断吗?