URAL 1035 Cross-stitch

一道图的 模拟题,,,,,//这么说你是傻逼么,,,,,欧拉路径啊!!!!!!!!

斜线代表缝的线,每个格子的顶点都可以想做是有小孔可以穿过去的,,,然后就是正常的缝针的想法,,,,问缝出给的图案的最少步数,,,,,,缝过来,缝过去的~

开始是想完全模拟(就是一种情况写一个函数),但是一旦穿过一个面,,,会面临4种情况。。。。。。。。。

结果就写了200+行,,但是还是错了。。。。。

给几组样例

5 4

..\/

\/..

/X..

..X/

..X.

..X.

\/\/

\/..

\/..

\/..

ans:13

3 3

..\

/\X

...

..\

///

...

ans:2

我觉得很好的一个解法就是求每个点的入度和出度然后看有多少奇数的。。。。。。。没验证过。

#include<stdio.h>

#include<string.h>

#include <algorithm>

#include <bits/stdc++.h>

using namespace std;

int p[40500],a[40500][2],sum[40500],n,m;

int find(int x)

{

if(p[x]!=x)p[x]=find(p[x]);

return p[x];

}

int judge(int x,int y)

{

return(find(x)==find(y))?1:0;

}

void make(int side)

{

int ul,ur,dl,dr;

char c;

for(int i=0;i<n;i++)

for(int j=0;j<m;j++)

{

cin>>c;

ul=i*(m+1)+j;ur=ul+1;

dl=(i+1)*(m+1)+j;dr=dl+1;

if((c==‘X‘)||(c==‘\\‘))

{

a[ul][side]++;a[dr][side]++;

if(!judge(ul,dr))p[p[ul]]=p[dr];

}

if((c==‘X‘)||(c==‘/‘))

{

a[ur][side]++;a[dl][side]++;

if(!judge(ur,dl))p[p[ur]]=p[dl];

}

}

}

int main()

{

scanf("%d%d",&n,&m);

int i,j,ans=0;

for(i=0;i<(m+1)*(n+1);i++)p[i]=i;

make(0);

make(1);

for(i=0;i<(m+1)*(n+1);i++)

{

if(a[i][0]||a[i][1]) sum[find(i)]+=abs(a[i][0]-a[i][1]);

}

for(i=0;i<(m+1)*(n+1);i++)

{

if((a[i][0]||a[i][1])&&(p[i]==i))ans+=sum[i]?sum[i]/2:1;

}

printf("%d\n",ans);

return 0;

}

其实还是用dfs比较好,,,,把情况合并合并,,,,,,,





版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-10-09 16:50:57

URAL 1035 Cross-stitch的相关文章

URAL 1035 Lucky Tickets

题意:长度为2n的数字,前N位之和和后面的一样,,,加一起是s........问有多少种不同的数字 首先s是奇数肯定就不行了.... 然后n*2*9<s也不行了...... dp[i][j]+=dp[i-1][j-k];就是加的这位不同的情况·~~~ 这题要用高精度,,,, #include<stdio.h> #include<string.h> #include <algorithm> #include <bits/stdc++.h> using n

好几年才收集到的软件,分享给大家。。。

QQ:365543212Email:[email protected]请按Clrt+F查找,输入软件关键字查询(不要输入版本号),如果找不到,您可以咨询客服.................FD......................12D MODEL 7.0 规划设计232Analyzer v4.1 高级串口分析监测3D Home Architect Design Suite Deluxe 8.0 室内装潢3D Profiler Tools 11.2 For Archicad 113D R

URAL 1348 Goat in the Garden 2(点到线段的距离)

[题目链接]:click here~~ [题目大意]:求某点到一条线段的最小距离与最大距离. [思路]: 分析可知,最大距离一定在端点处取得.那么接下来求最小距离时,先求出垂线与线段所在直线的交点,然后判断交点在不在线段上.如果在,则最小距离为垂线段的距离,即交点到此点的距离.如果不在,则最小距离必在另一端点取得.问题转换如何判断点与线段的垂足是否在线段上,可以利用叉积方便的求出. 代码: /* * Problem: NO:URAL 1348 * Running time: 1MS * Comp

【计算几何】URAL - 2101 - Knight&#39;s Shield

Little Peter Ivanov likes to play knights. Or musketeers. Or samurai. It depends on his mood. For parents, it is still always looks like "he again found a stick and peels the trees." They cannot understand that it is a sword. Or epee. Or katana.

URAL比赛记录

URAL 1961 考虑到此人也在中国,N要加一. #include<cstdio> #include<iostream> using namespace std; int main() { double n,m,N; int ans; cin>>n>>m>>N; ans=(N+1.0)*m/n; if(ans>N) ans=N; cout<<ans<<endl; return 0; } URAL 1962 显然如果

SYSU-1,URAL 1894,闽科夫斯基和(黑科技)

题目大题:给你两个相交的凸包,其中一个可移动,问你至少移动多少能够让两个凸包分离 解:我艹我为此写了7k计算几何还是wa6了,后面去看discuz才知道是用一个闽科夫斯基和的黑科技. 闽科夫斯基和大概就是两个点集的任意两个点对相加得到的一个新点集,差则是相减.这题用到了以下几个性质: 1:两个凸包的闽科夫斯基差还是凸包 2:两个凸包若相交,那么他们闽科夫斯基差的凸包覆盖原点 易知答案是原点到凸包最短距离(可以看作一个凸包平移这个向量,那么他们的闽科夫斯基差就不过原点了,所以相离) 现在问题在于如

Ural 1081 Binary Lexicographic Sequence(DP)

题目地址:Ural 1081 先用dp求出每个长度下的合法序列(开头为1)的个数.然后求前缀和.会发现正好是一个斐波那契数列.然后每次判断是否大于此时长度下的最少个数,若大于,说明这一位肯定是1,若小于,则肯定是0.就这样不断输出出来即可. 代码如下: #include <iostream> #include <cstdio> #include <string> #include <cstring> #include <stdlib.h> #in

URAL 1684. Jack&#39;s Last Word KMP

题目来源:URAL 1684. Jack's Last Word 题意:输入a b 把b分成若干段 每一段都是a的前缀 思路:b为主串 然后用a匹配b 记录到b的i位置最大匹配的长度 然后分割 分割的时候要从后往前 如果a = abac b = abab 那么如果从前往后 首先覆盖了aba 然后b就不能覆盖了 从后往前就可以了 首先覆盖ab 下一次还是ab 因为已经记录了到i位置的最大匹配长度 根据长度从末尾倒退 每次倒退的时候只要是最大的匹配的长度 因为如果在某一次的递推 记录的最大匹配的前缀

使用 CROSS APPLY 与 OUTER APPLY 连接查询

?  前言 日常开发中遇到多表查询时,首先会想到 INNER JOIN 或 LEFT OUTER JOIN 等等,但是这两种查询有时候不能满足需求.比如,左表一条关联右表多条记录时,我需要控制右表的某一条或多条记录跟左表匹配.貌似,INNER JOIN 或 LEFT OUTER JOIN 不能很好完成.但是 CROSS APPLY 与 OUTER APPLY 可以,下面用示例说明. 1.   示例一 ?  有两张表:Student(学生表)和 Score(成绩表),数据如下: 1)   查询每个