【宽搜】【并查集】Vijos P1015 十字绣
题目链接:
题目大意:
n*m的网格,线只能在网格的顶点处才能从布的一面穿到另一面。每一段线都覆盖一个单位网格的两条对角线之一,而在绣的过程中,一针中连续的两段线必须分处布的两面。
给出布两面的图案,问最少需要几针才能绣出来?一针是指针不离开布的一次绣花过程。
题目思路:
【宽搜】或【并查集】
正面的如果有线就把端点连正边,反面连负边。
一针就是从正边到反边再到正边这样循环下去。用宽搜写floodfill(或者并查集)把一次走到线路抠出来,线路上|正边数-反边数|/2为该线路的针数。
感觉自己说不太清楚,引用大牛zhymaoiing的话:
将正面的边视为正边,反面的则视为负边。用floodfill将由正边和负边交替连接的结点组成一个块。对于每一个块,其中的所有结点的正边数目和负边数目之差的绝对值(定为dep)之后div 2后就为这个块的所需针数。
在一个块中只用一针就可完成,假设该针由v1出发,到vn结束,那么v1到vn中间的点的dep为0,而v1和vn则为1。也就是说块中的那一针在v1有一个入口,在vn有一个出口,而每一对入口和出口就代表了一针,那么就可以通过dep之和除以2得到所需针数。由此可以拓宽到多针。
/
//by coolxxx
//
#include<iostream>
#include<algorithm>
#include<string>
#include<iomanip>
#include<memory.h>
#include<time.h>
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<stdbool.h>
#include<math.h>
#define min(a,b) ((a)<(b)?(a):(b))
#define max(a,b) ((a)>(b)?(a):(b))
#define abs(a) ((a)>0?(a):(-(a)))
#define lowbit(a) (a&(-a))
#define sqr(a) ((a)*(a))
#define swap(a,b) ((a)^=(b),(b)^=(a),(a)^=(b))
#define eps 1e-8
#define J 10
#define MAX 0x7f7f7f7f
#define PI 3.1415926535897
#define N 207
using namespace std;
int n,m,lll,ans,cas;
char map[][N][N];
bool u[N][N];
bool f;
void floodfill(int i,int j)
{
int t=,k;
if(u[i][j])return;
u[i][j]=;
if(i> && j>)
{
for(k=;k<;k++)
{
if(map[k][i-][j-]=='\\' || map[k][i-][j-]=='X')
{
t=t+(-)*k+;
f=;
floodfill(i-,j-);
}
}
}
if(i> && j<=m)
{
for(k=;k<;k++)
{
if(map[k][i-][j]=='/' || map[k][i-][j]=='X')
{
t=t+(-)*k+;
f=;
floodfill(i-,j+);
}
}
}
if(i<=n && j>)
{
for(k=;k<;k++)
{
if(map[k][i][j-]=='/' || map[k][i][j-]=='X')
{
t=t+(-)*k+;
f=;
floodfill(i+,j-);
}
}
}
if(i<=n && j<=m)
{
for(k=;k<;k++)
{
if(map[k][i][j]=='\\' || map[k][i][j]=='X')
{
t=t+(-)*k+;
f=;
floodfill(i+,j+);
}
}
}
lll+=abs(t);
}
int main()
{
#ifndef ONLINE_JUDGE
// freopen("1.txt","r",stdin);
// freopen("2.txt","w",stdout);
#endif
int i,j,k;
// while(~scanf("%s",s1))
while(~scanf("%d",&n))
// for(scanf("%d",&cas),l=1;l<=cas;l++)
{
memset(u,,sizeof(u));
ans=;
scanf("%d",&m);
for(k=;k<;k++)
for(i=;i<=n;i++)
scanf("%s",map[k][i]+);
for(i=;i<=n+;i++)
{
for(j=;j<=m+;j++)
{
lll=f=;
floodfill(i,j);
if(f && lll==)ans++;
else ans+=lll/;
}
}
printf("%d\n",ans);
}
return ;
} /*
// //
*/
千万不要点
//
//by coolxxx
//
#include<iostream>
#include<algorithm>
#include<string>
#include<iomanip>
#include<memory.h>
#include<time.h>
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<stdbool.h>
#include<math.h>
#define min(a,b) ((a)<(b)?(a):(b))
#define max(a,b) ((a)>(b)?(a):(b))
#define abs(a) ((a)>0?(a):(-(a)))
#define lowbit(a) (a&(-a))
#define sqr(a) ((a)*(a))
#define swap(a,b) ((a)^=(b),(b)^=(a),(a)^=(b))
#define eps 1e-8
#define J 10
#define MAX 0x7f7f7f7f
#define PI 3.1415926535897
#define N 207
using namespace std;
int n,m,lll,ans,cas,cass;
int a[N*N],b[N*N],fa[N*N],c[N*N];
bool u[N*N],v[N*N];
char map[][N][N];
int zhao(int aa)
{
if(fa[aa]==-)return aa;
return fa[aa]=zhao(fa[aa]);
}
int main()
{
#ifndef ONLINE_JUDGE
// freopen("1.txt","r",stdin);
// freopen("2.txt","w",stdout);
#endif
int i,j,k,x,y,fx,fy;
// while(~scanf("%s",s1))
while(~scanf("%d",&n))
// for(scanf("%d",&cas),cass=1;cass<=cas;cass++)
{
memset(fa,-,sizeof(fa));
memset(a,,sizeof(a));
memset(b,,sizeof(b));
memset(u,,sizeof(u));
memset(v,,sizeof(v));
ans=;c[]=;
scanf("%d",&m);
for(k=;k<;k++)
for(i=;i<n;i++)
scanf("%s",map[k][i]);
for(k=;k<;k++)
{
for(i=;i<n;i++)
{
for(j=;j<m;j++)
{
if(map[k][i][j]=='\\' || map[k][i][j]=='X')
{
x=i*(m+)+j;y=(i+)*(m+)+j+;
fx=zhao(x);fy=zhao(y);
if(fx!=fy)
fa[fy]=fx;
a[x]+=(-)*k+;
a[y]+=(-)*k+;
v[x]=v[y]=;
}
if(map[k][i][j]=='/' || map[k][i][j]=='X')
{
x=i*(m+)+j+;y=(i+)*(m+)+j;
fx=zhao(x);fy=zhao(y);
if(fx!=fy)
fa[fy]=fx;
a[x]+=(-)*k+;
a[y]+=(-)*k+;
v[x]=v[y]=;
}
}
}
}
for(i=;i<(n+)*(m+);i++)
{
if(!v[i])continue;
j=zhao(i);
if(!u[j])u[j]=,c[++c[]]=j;
b[j]+=abs(a[i]);
}
for(i=;i<=c[];i++)
{
if(b[c[i]]==)ans++;
else ans+=b[c[i]]/;
}
printf("%d\n",ans);
}
return ;
} /*
// //
*/
千万不要点
【宽搜】【并查集】Vijos P1015 十字绣的更多相关文章
- 【BZOJ】1016: [JSOI2008]最小生成树计数 深搜+并查集
最小生成树计数 Description 现在给出了一个简单无向加权图.你不满足于求出这个图的最小生成树,而希望知道这个图中有多少个不同的最小生成树.(如果两颗最小生成树中至少有一条边不同,则这两个最小 ...
- 【宽搜】Vijos P1360 八数码问题
题目链接: https://vijos.org/p/1360 题目大意: 3x3格子上放1~8数字,一个空位,每次空位可与上下左右交换,固定终止布局,求输入的起始布局需要几步到达终止布局 题目思路: ...
- 【宽搜】Vijos P1206 CoVH之再破难关
题目链接: https://vijos.org/p/1206 题目大意: 给你开始和结束两张4x4的01图,每次操作只能够交换相邻的两个格子(有公共边),问最少的操作步数. 题目思路: [搜索] 这题 ...
- 【宽搜】Vijos P1051 送给圣诞夜的极光
题目链接: https://vijos.org/p/1051 题目大意: 给一张‘-’和‘#’的图,规定曼哈顿距离小于等于2的‘#’属于同一图案,求图案数.[曼哈顿距离:对于A(x1,y1)和B(x2 ...
- Vijos 1034 家族 并查集
描述 若某个家族人员过于庞大,要判断两个是否是亲戚,确实还很不容易,现在给出某个亲戚关系图,求任意给出的两个人是否具有亲戚关系. 规定:x和y是亲戚,y和z是亲戚,那么x和z也是亲戚.如果x,y是亲戚 ...
- hdu 1198 Farm Irrigation(深搜dfs || 并查集)
转载请注明出处:viewmode=contents">http://blog.csdn.net/u012860063?viewmode=contents 题目链接:http://acm ...
- 【带权并查集】【离散化】vijos P1112 小胖的奇偶
每个区间拆成r和l-1两个端点,若之内有偶数个1,则这两个端点对应的前缀的奇偶性必须相同,否则必须相反. 于是可以用带权并查集维护,每个结点储存其与其父节点的奇偶性是否相同,并且在路径压缩以及Unio ...
- vijos 1250 最勇敢的机器人 分组背包+并查集
P1250最勇敢的机器人 背景 Wind设计了很多机器人.但是它们都认为自己是最强的,于是,一场比赛开始了~ 描述 机器人们都想知道谁是最勇敢的,于是它们比赛搬运一些物品. 它们到了一个仓库,里面有n ...
- 【csp模拟赛5】加减法--宽搜维护联通快
题目大意: 一开始想用并查集,发现很难维护联通块的代表元素,所以用了宽搜,开数组会炸,所以开一个优先队列维护,每扫完一个联通块,统计答案,清空优先队列,!!千万记住注意数组的大小!!! 代码: #in ...
随机推荐
- rsyslog安装
http://www.rsyslog.com/downloads/download-other/ http://www.rsyslog.com/download/stable-download/pag ...
- linux中 vi / vim显示行号或取消行号命令
1. 显示行号 :set number 或者 :set nu 2. 取消行号显示 :set nu! 3. 每次打开都显示行号 修改vi ~/.vimrc 文件,添加:set number
- 汉诺塔III 递推题
题目描述: 约19世纪末,在欧州的商店中出售一种智力玩具,在一块铜板上有三根杆,最左边的杆上自上而下.由小到大顺序串着由64个圆盘构成的塔.目的是将最左边杆上的盘全部移到右边的杆上,条件是一次只能移动 ...
- [转] linux之sed用法
sed是一个很好的文件处理工具,本身是一个管道命令,主要是以行为单位进行处理,可以将数据行进行替换.删除.新增.选取等特定工作,下面先了解一下sed的用法sed命令行格式为: sed ...
- Topcoder SRM 656 (Div.1) 250 RandomPancakeStack - 概率+记忆化搜索
最近连续三次TC爆零了,,,我的心好痛. 不知怎么想的,这题把题意理解成,第一次选择j,第二次选择i后,只能从1~i-1.i+1~j找,其实还可以从j+1~n中找,只要没有被选中过就行... [题意] ...
- (转)dedecms入门
学dedecms一段时间了,把我的入门体会和大家分享一下. 什么是dedecm cms(内容管理系统):现在有各种内容模型,如书评(包括书名,出版社,评论等字段).cms一般有用户后台,网页的用户可以 ...
- 微信返回上一页,页面中的AJAX的请求,对Get请求无效的解决办法
问题产生原因 最近在做一个微信的项目时,遇到一种很常见的情况,需求是这样的,当用户进入到"我的个人中心"的时候,会有一个点击跳转填写认证资料的按钮,点击此按钮后,会跳转 ...
- Objective-C中的协议(Protocol)和类别(Category)
1.什么是协议? 2.协议与类别的声明和使用 1.什么是协议? 在Objective-C中,不支持多继承,即不允许一个类有多个父类,但是OC提供了类似的实现方法,也就是协议.协议有点类似于Java里的 ...
- Qt Painter放大时,event处理应该注意的要点
比如当你Qt中用QPainter进行window和viewport,逻辑和物理坐标分离的形式进行绘图放大的时候,你会发现鼠标的移动和放大之后的图像有点不跟手,比如你是用QTransform进行放大变换 ...
- 转:Remote debugging with Visual Studio 2010
Original URL http://www.codeproject.com/Articles/146838/Remote-debugging-with-Visual-Studio-2010 you ...