【宽搜】【并查集】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 ...
随机推荐
- [PWA] 15. Using The IDB Cache And Display Entries
We want to use IDB to store the wittr messages. The logic is when the page start: service worker wil ...
- Toast的使用具体解释
Android中提供一种简单的Toast消息提示框机制,能够在用户点击了某些button后,提示用户一些信息,提示的信息不能被用户点击,Toast的提示信息依据用户设置的显示时间后自己主动消失.Toa ...
- Android 使用加速度传感器实现摇一摇功能及优化
如有转载,请声明出处: 时之沙: http://blog.csdn.net/t12x3456 目前很多应用已经实现了摇一摇功能,这里通过讲解该功能的原理及实现回顾一下加速度传感器的使用: 1.首先获得 ...
- Monitor and diagnose performance in Java SE 6--转载
Java SE 6 provides an in-depth focus on performance, offering expanded tools for managing and monito ...
- yii phpexcel <转>
原文详情参见 这里 1.下载phpexcel,将压缩包中的classes复制到protected/extensions下并修改为PHPExcel. 2.修改YII配置文件config/main.php ...
- js的异步的问题的再次理解
*js是实实在在的单线程语言,在一小个时刻,在(js的执行对列)只有一个执行,一个没有完,另一个必须等待,什么都不做,只有抖着腿的等; *本来语言本身是同步的,之所以是异步执行,是因为在浏览器环境中, ...
- 抓取锁的sql语句-第三次修改
CREATE OR REPLACE PROCEDURE SOLVE_LOCK AS V_SQL VARCHAR2(3000); --定义 v_sql 接受抓取锁的sql语句CUR_LOCK SYS_R ...
- [!] CocoaPods was not able to update the `master` repo...
输入pod install之后出现: [!] CocoaPods was not able to update the `master` repo. If this is an unexpected ...
- 什么是NSAssert?
断言, 判断是否符合某个特定条件, 符合就继续运行程序, 反之就抛出异常, 后面为自定义错误提示, 也可以使用NSParameterAssert, 在调试上有着很大的方便 int a = 0; NSA ...
- ubuntu下安装Vmare Workstation,并安装mac补丁
最近想学习一下关于ios方面的开发,但是苦于自己的电脑已经装了两个系统:一个win7,一个ubuntu.两系统均装在物理硬盘上,不想格盘,所以装个虚拟机玩玩.决定使用Vmare Workstation ...