现在居然出现一道题只有\(pascal\)题解没有\(C++\)题解的情况,小蒟蒻要打破它。

思维题:分类讨论

回归正题,此题十分考验思维,首先我们要考虑如何把不会走的地方给填上,使最后只用求一遍这个图的周长即可。考虑目标点的几种情况:

\(0.\)当前点周围有三个\(A\)或四个\(A\)时:这个点肯定不会走到,直接用\(A\)填上。

\(1.\)当前点夹在两个点中间,无法判断这个点被填上后是否会让两边出现独立的\(x\),所以跳过该点,之后如果某一边被填满,会导致这个点被重新搜到,那时再考虑。

\(2.\)当前点被两个相邻的\(A\)夹在一起,且当前点填上时周围八格没有任何\(x\),那么直接填上。

\(3.\)当前点被两个相邻的\(A\)夹在一起,且当前点填上时周围八格有\(x\)那么这个点肯定会被经过,因为无论往外怎么伸展,最后必须从这里过去以绕开那个\(x\)。

\(4.\)当前点周围有一个\(A\)或没有\(A\),那么这个点先不管,等会也可能再次搜到。

复杂度证明:因为每个点只会有一次变成\(A\)然后向外搜索,所以复杂度为\(O(nm)\)

对于处理出来的图,我们只用判断每个点会被经过几次就行了:每个点经过的次数等于这个点周围\(八格\)的连续\(A\)段数。

最后上神奇的代码:

#include<bits/stdc++.h>
using namespace std;
const int N=1010;
const int dx[]={0,1,0,-1};
const int dy[]={1,0,-1,0};
int n,m;
char mp[N][N];
void dfs(int x,int y){
int cnt=0;
int u[5];
for(int i=0;i<4;++i){
int nx=x+dx[i],ny=y+dy[i];
if(mp[nx][ny]=='A'){
u[++cnt]=i;
}
}
if(cnt==2){
if(u[2]-u[1]==2)return;
if(mp[x-dx[u[1]]-dx[u[2]]][y-dy[u[1]]-dy[u[2]]]!='.')return;
}
if(cnt>1){
mp[x][y]='A';
for(int i=0;i<4;++i){
int nx=x+dx[i],ny=y+dy[i];
if(nx>1&&nx<n&&ny>1&&ny<m&&mp[nx][ny]=='.'){
dfs(nx,ny);
}
}
}
}
int main(){
cin>>n>>m;
for(int i=1;i<=n;++i){
scanf("%s",mp[i]+1);
}
for(int i=2;i<n;++i){
for(int j=2;j<m;++j){
if(mp[i][j]=='.')dfs(i,j);
}
}
int ans=0;
for(int x=1;x<=n;++x){
for(int y=1;y<=m;++y){
int js=0;
if(mp[x][y]=='.'){
int u[5],cnt=0;
for(int i=0;i<4;++i){
int nx=x+dx[i],ny=y+dy[i];
if(mp[nx][ny]=='A')u[++cnt]=i;
}
if(cnt==1){
js=1;
}else if(cnt==2&&abs(u[2]-u[1])==2){
js=2;
}else if(cnt==2)js=1;
for(int i=0;i<4;++i){
int nx=x+dx[i],ny=y+dy[i];
if(mp[nx][ny]!='A'){
nx=x+dx[(i+1)%4],ny=y+dy[(i+1)%4];
if(mp[nx][ny]!='A'){
nx=x+dx[i]+dx[(i+1)%4],ny=y+dy[i]+dy[(i+1)%4];
if(mp[nx][ny]=='A'){
js++;
}
}
}
}
ans+=js;
}
}
}
cout<<ans<<endl;
}

bzoj1784: [Usaco2010 Jan]island的更多相关文章

  1. BZOJ2021: [Usaco2010 Jan]Cheese Towers

    2021: [Usaco2010 Jan]Cheese Towers Time Limit: 4 Sec  Memory Limit: 64 MBSubmit: 184  Solved: 107[Su ...

  2. 2020: [Usaco2010 Jan]Buying Feed, II

    2020: [Usaco2010 Jan]Buying Feed, II Time Limit: 3 Sec  Memory Limit: 64 MBSubmit: 220  Solved: 162[ ...

  3. bzoj 1783: [Usaco2010 Jan]Taking Turns

    1783: [Usaco2010 Jan]Taking Turns Description Farmer John has invented a new way of feeding his cows ...

  4. BZOJ_3049_[Usaco2013 Jan]Island Travels _状压DP+BFS

    BZOJ_3049_[Usaco2013 Jan]Island Travels _状压DP+BFS Description Farmer John has taken the cows to a va ...

  5. [Usaco2013 Jan]Island Travels

    Description Farmer John has taken the cows to a vacation out on the ocean! The cows are living on N ...

  6. [bzoj1783] [Usaco2010 Jan]Taking Turns

    题意: 一排数,两个人轮流取数,保证取的位置递增,每个人要使自己取的数的和尽量大,求两个人都在最优策略下取的和各是多少. 注:双方都知道对方也是按照最优策略取的... 傻逼推了半天dp......然后 ...

  7. 【BZOJ】2021: [Usaco2010 Jan]Cheese Towers(dp)

    http://www.lydsy.com/JudgeOnline/problem.php?id=2021 噗,自己太弱想不到. 原来是2次背包. 由于只要有一个大于k的高度的,而且这个必须放在最顶,那 ...

  8. 【BZOJ】2020: [Usaco2010 Jan]Buying Feed, II (dp)

    http://www.lydsy.com/JudgeOnline/problem.php?id=2020 和背包差不多 同样滚动数组 f[j]表示当前位置j份食物的最小价值 f[j]=min(f[j- ...

  9. BZOJ 2020 [Usaco2010 Jan]Buying Feed,II:贪心【定义价值】

    题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=2020 题意: FJ开车去买K份食物. 如果他的车上有X份食物,每走一里就花费X元. FJ的 ...

随机推荐

  1. react-native-typescript-项目环境搭建

    1.yarn global add create-react-native-app //全局安装 2.create-react-native-app 项目名称 3.yarn add typescrip ...

  2. urlencode编码 — 为什么要编码

    原文链接:https://blog.csdn.net/stpeace/article/details/82892571 参考:https://blog.csdn.net/z69183787/artic ...

  3. libevent实现对管道的读写操作

    读管道: #include <stdio.h> #include <unistd.h> #include <stdlib.h> #include <sys/t ...

  4. 12 IO流(九)——装饰流 BufferedInputStream/OutputStream

    我们按功能可以将IO流分为节点流与处理流 节点流:可以直接从数据源或目的地读写数据 处理流(装饰流):不直接连接到数据源或目的地,是其他流(必须包含节点流)进行封装.目的主要是简化操作和提高性能. B ...

  5. kubernetes1.16 配置 metrics-server

    kubernetes1.16 版本对应最新的metrics-server为v0.3.5. 下载metrics-server配置文件 git clone https://github.com/kuber ...

  6. Js学习02--变量、关键字、标识符

    一.Js变量的定义 1.定义变量的目的 在内存中分配一块存储空间给变量,方便以后存储数据. 2.如何定义变量 任何变量在使用前都必须定义变量 var 变量名称 eg: var name,age,sex ...

  7. asp.net Code CSRedis学习记录

    1.安装Redis for windows 安装地址 https://github.com/MicrosoftArchive/redis/releases Redis 是完全开源免费的,遵守BSD协议 ...

  8. Jupyter交互式工具安装使用

    Jupyter交互式工具安装使用 Jupyter Notebook(此前被称为IPython notebook)是一个交互式笔记本,支持运行 40 多种编程语言. 文档:https://jupyter ...

  9. Intel realSense ubuntu 16.04+python 环境配置指南

    1. 安装librealsense2-dkms 以及librealsense2-utils 1.Register the server's public key: sudo apt-key adv - ...

  10. IOS - UDID IDFA IDFV MAC keychain

    在开发过程中,我们经常会被要求获取每个设备的唯一标示,以便后台做相应的处理.我们来看看有哪些方法来获取设备的唯一标示,然后再分析下这些方法的利弊. 具体可以分为如下几种: UDID IDFA IDFV ...