bzoj1784: [Usaco2010 Jan]island
现在居然出现一道题只有\(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的更多相关文章
- BZOJ2021: [Usaco2010 Jan]Cheese Towers
2021: [Usaco2010 Jan]Cheese Towers Time Limit: 4 Sec Memory Limit: 64 MBSubmit: 184 Solved: 107[Su ...
- 2020: [Usaco2010 Jan]Buying Feed, II
2020: [Usaco2010 Jan]Buying Feed, II Time Limit: 3 Sec Memory Limit: 64 MBSubmit: 220 Solved: 162[ ...
- bzoj 1783: [Usaco2010 Jan]Taking Turns
1783: [Usaco2010 Jan]Taking Turns Description Farmer John has invented a new way of feeding his cows ...
- 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 ...
- [Usaco2013 Jan]Island Travels
Description Farmer John has taken the cows to a vacation out on the ocean! The cows are living on N ...
- [bzoj1783] [Usaco2010 Jan]Taking Turns
题意: 一排数,两个人轮流取数,保证取的位置递增,每个人要使自己取的数的和尽量大,求两个人都在最优策略下取的和各是多少. 注:双方都知道对方也是按照最优策略取的... 傻逼推了半天dp......然后 ...
- 【BZOJ】2021: [Usaco2010 Jan]Cheese Towers(dp)
http://www.lydsy.com/JudgeOnline/problem.php?id=2021 噗,自己太弱想不到. 原来是2次背包. 由于只要有一个大于k的高度的,而且这个必须放在最顶,那 ...
- 【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- ...
- BZOJ 2020 [Usaco2010 Jan]Buying Feed,II:贪心【定义价值】
题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=2020 题意: FJ开车去买K份食物. 如果他的车上有X份食物,每走一里就花费X元. FJ的 ...
随机推荐
- 【LeetCode】下一个排列【找规律】
实现获取下一个排列的函数,算法需要将给定数字序列重新排列成字典序中下一个更大的排列. 如果不存在下一个更大的排列,则将数字重新排列成最小的排列(即升序排列). 必须原地修改,只允许使用额外常数空间. ...
- python大道——博客目录
python基础 第一章 计算机基础 计算机基础 第二章 python基础语法 python入门 第三章 基础数据类型和文件操作 整型.布尔.字符串 列表.字典.集合 公共功能.小数据池 hash ...
- (二)Django自定义标签
1.创建自定义标签 在项目的APP中新建一个Python Package-->blog_tags.py 代码: from django import template from ..models ...
- Codechef TSUM2 Sum on Tree 点分治、李超线段树
传送门 点分治模板题都不会迟早要完 发现这道题需要统计所有路径的信息,考虑点分治统计路径信息. 点分治之后,因为路径是有向的,所以对于每一条路径都有向上和向下的两种.那么如果一条向上的路径,点数为\( ...
- MOOC web前端开发笔记(二)
HTML HTML概述 HTML(HyperText MarkUp Language) "超文本标记语言",以标签的形式规定网页结构,它是制作网页的标准语言 HTML不区分大小写 ...
- Spring Aop中execution的语法
参考地址:https://blog.csdn.net/zz210891470/article/details/54175107 execution(* com.sample.service.impl. ...
- C# HtmlAgilityPack+Selenium爬取需要拉动滚动条的页面内容
现在大多数网站都是随着滚动条的滑动加载页面内容的,因此单纯获得静态页面的Html是无法获得全部的页面内容的.使用Selenium就可以模拟浏览器拉动滑动条来加载所有页面内容. 前情提要 C#HtmlA ...
- flutter AnimationBuilder
class BuilderPage extends StatefulWidget { @override State<StatefulWidget> createState() { // ...
- native function 'Window_sendPlatformMessage' (4 arguments) cannot be found
https://github.com/pauldemarco/flutter_blue/issues/140 https://github.com/flutter/flutter/issues/168 ...
- 查询本地ip以及ip地址库查询
四种方法查询本地ip from urllib2 import urlopen from json import load my_ip = urlopen('http://ip.42.pl/raw'). ...