HDU4414-DFS
给一个图,寻找十字交叉的个数,十字交叉应为两个大于3的奇数交叉与正中央。图的大小很小。
使用DFS搜八连块,之后按照规则筛选出符合条件的交叉。
我的筛选规则有点蠢,先将点排序,再通过三段for循环判断。
#include <algorithm>
#include <cstring>
#include <ctype.h>
#include <cstdlib>
#include <cstdio>
#include <vector>
#include <string>
#include <queue>
#include <stack>
#include <cmath>
#include <set>
#include <map> using namespace std; struct Node{
int x;
int y;
bool operator < (const struct Node &b) const
{
if(x <= b.x)
{
if(x == b.x) return y <= b.y;
else return true;
}
return false;
}
}cross[]; int N,M,T;
char G[];
int vis[];
int dx[] = {,-,,},dy[] = {,,,-};
int P; void dfs(int u)
{
vis[u] = true;
cross[P].x = u%N;cross[P].y = u/N;
P++;
for(int i=;i<;i++)
{
int x = u%N + dx[i],y = u/N + dy[i];
if(x >= && x < N && y >= && y < N &&!vis[y*N+x] && G[y*N+x] == '#')
{
dfs(x+y*N);
}
}
} int main()
{
while(scanf("%d ",&N) && N)
{
char s[];
for(int i=;i<N;i++)
{
scanf("%s",s);
for(int j=;j<N;j++)
{
G[i*N+j] = s[j];
}
} memset(vis,,sizeof vis);
int ans = ;
for(int i=;i<N;i++)
{
for(int j=;j<N;j++)
{
if(G[i*N+j] != '#' || vis[i*N+j]) continue;
P = ;
dfs(i*N+j);
// printf("P=%d\n",P);
if(P % == || P < ) continue;
else
{
//printf("check\n");
sort(cross,cross+P);
/*
for(int i=0;i<P;i++)
{
printf("%d:(%d,%d)\n",i,cross[i].x,cross[i].y);
}
*/
int len = (P+)/,ok = ,step = ;
for(int i=;i<(len-)/;i++)
{
if(cross[i].x != cross[].x+i || cross[i].y != cross[].y) {ok = ;break;}
}
step += (len-)/;
for(int i=step;i < len+step;i++)
{
if(cross[i].y != (cross[step].y+i-step)
|| cross[i].x != cross[step].x
|| cross[step].x != cross[step-].x+
|| cross[step].y != cross[step-].y-(len-)/)
{ok = ;break;}
}
step += len;
for(int i=step;i< step + (len-)/;i++)
{
if(cross[i].x != (cross[step].x+i-step)
|| cross[i].y != cross[step].y
|| cross[step].y != cross[].y)
{ok = ;break;}
}
if(ok) ans++;
} }
}
printf("%d\n",ans);
}
}
HDU4414-DFS的更多相关文章
- hdu4414(DFS 找十字架数量)
Problem Description The Nazca Lines are a series of ancient geoglyphs located in the Nazca Desert in ...
- BZOJ 3083: 遥远的国度 [树链剖分 DFS序 LCA]
3083: 遥远的国度 Time Limit: 10 Sec Memory Limit: 1280 MBSubmit: 3127 Solved: 795[Submit][Status][Discu ...
- BZOJ 1103: [POI2007]大都市meg [DFS序 树状数组]
1103: [POI2007]大都市meg Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 2221 Solved: 1179[Submit][Sta ...
- BZOJ 4196: [Noi2015]软件包管理器 [树链剖分 DFS序]
4196: [Noi2015]软件包管理器 Time Limit: 10 Sec Memory Limit: 512 MBSubmit: 1352 Solved: 780[Submit][Stat ...
- 图的遍历(搜索)算法(深度优先算法DFS和广度优先算法BFS)
图的遍历的定义: 从图的某个顶点出发访问遍图中所有顶点,且每个顶点仅被访问一次.(连通图与非连通图) 深度优先遍历(DFS): 1.访问指定的起始顶点: 2.若当前访问的顶点的邻接顶点有未被访问的,则 ...
- BZOJ 2434: [Noi2011]阿狸的打字机 [AC自动机 Fail树 树状数组 DFS序]
2434: [Noi2011]阿狸的打字机 Time Limit: 10 Sec Memory Limit: 256 MBSubmit: 2545 Solved: 1419[Submit][Sta ...
- POJ_2386 Lake Counting (dfs 错了一个负号找了一上午)
来之不易的2017第一发ac http://poj.org/problem?id=2386 Lake Counting Time Limit: 1000MS Memory Limit: 65536 ...
- 深度优先搜索(DFS)
[算法入门] 郭志伟@SYSU:raphealguo(at)qq.com 2012/05/12 1.前言 深度优先搜索(缩写DFS)有点类似广度优先搜索,也是对一个连通图进行遍历的算法.它的思想是从一 ...
- 【BZOJ-3779】重组病毒 LinkCutTree + 线段树 + DFS序
3779: 重组病毒 Time Limit: 20 Sec Memory Limit: 512 MBSubmit: 224 Solved: 95[Submit][Status][Discuss] ...
- 【BZOJ-1146】网络管理Network DFS序 + 带修主席树
1146: [CTSC2008]网络管理Network Time Limit: 50 Sec Memory Limit: 162 MBSubmit: 3495 Solved: 1032[Submi ...
随机推荐
- 使用proxy来简单的实现一个观察者
var obv = (function() { var cache = new Map(); var observe = function (proxy, fn) { if (!cache.has(p ...
- linux下文件共享的几种常用方式
1. python方式,做一个简单的服务器.默认是开启8000端口. > python -m SimpleHTTPServer 执行命令后,在浏览器上输入该机器IP+8000端口即可 2. sc ...
- BZOJ2154/BZOJ2693/Luogu1829 Crash的数字表格/JZPFAR 莫比乌斯反演
传送门--Luogu 传送门--BZOJ2154 BZOJ2693是权限题 其中JZPFAR是多组询问,Crash的数字表格是单组询问 先推式子(默认\(N \leq M\),所有分数下取整) \(\ ...
- Bitcoin 使用及配置记录
常用配置 bitcoin-qt.exe -testnet -printtoconsole -conf=D:\Bitcoin\bitcoin.conf -datadir=D:\Bitcoin\Data ...
- linux中fork, source和exec的区别
转:linux中fork, source和exec的区别 shell的命令可以分为内部命令和外部命令. 内部命令是由特殊的文件格式.def实现的,如cd,ls等.而外部命令是通过系统调用或独立程序实现 ...
- Spark Streaming简介及原理
简介: SparkStreaming是一套框架. SparkStreaming是Spark核心API的一个扩展,可以实现高吞吐量的,具备容错机制的实时流数据处理. 支持多种数据源获取数据: Spark ...
- @Pointcut的用法
在Spring 2.0中,Pointcut的定义包括两个部分:Pointcut表示式(expression)和Pointcut签名(signature).让我们先看看execution表示式的格式: ...
- Gerrit上分支操作记录(创建分支、删除分支)
Git分支对于一个项目的代码管理而言,是十分重要的!许多久用git的朋友可能已经掌握的很牢固了,但对于一些初涉git的童鞋来说,可能还不是很熟悉.在此,我将自己的一些操作经历做一梳理,希望能帮助到有用 ...
- ResultSet集合查询字段名称(转载)
转自:https://blog.csdn.net/song_litao/article/details/84751351 public List<String> getColumnName ...
- Oracle系列(三): 情景查询一 a表中有个fid字段,逗号分隔开来,b表中有id字段及其他信息,如何关联a表的fid和和b表的id字段查询
现在有两个表,表a中 DOC FID 1 a,b,c 2 a,c,d 表b中 ID KEY a A b B c C d D 怎么联合查询出 DOC FID KEY 1 a,b,c A,B,C 2 a, ...