zoukankan      html  css  js  c++  java
  • 【宽搜】【并查集】Vijos P1015 十字绣

    题目链接:

      https://vijos.org/p/1015

    题目大意

      n*m的网格,线只能在网格的顶点处才能从布的一面穿到另一面。每一段线都覆盖一个单位网格的两条对角线之一,而在绣的过程中,一针中连续的两段线必须分处布的两面。

      给出布两面的图案,问最少需要几针才能绣出来?一针是指针不离开布的一次绣花过程。

    题目思路:

      【宽搜】或【并查集】

      正面的如果有线就把端点连正边,反面连负边。

      一针就是从正边到反边再到正边这样循环下去。用宽搜写floodfill(或者并查集)把一次走到线路抠出来,线路上|正边数-反边数|/2为该线路的针数。

      感觉自己说不太清楚,引用大牛zhymaoiing的话:

        将正面的边视为正边,反面的则视为负边。用floodfill将由正边和负边交替连接的结点组成一个块。对于每一个块,其中的所有结点的正边数目和负边数目之差的绝对值(定为dep)之后div 2后就为这个块的所需针数。
    在一个块中只用一针就可完成,假设该针由v1出发,到vn结束,那么v1到vn中间的点的dep为0,而v1和vn则为1。也就是说块中的那一针在v1有一个入口,在vn有一个出口,而每一对入口和出口就代表了一针,那么就可以通过dep之和除以2得到所需针数。由此可以拓宽到多针。

    BFS
      1 /
      2 //by coolxxx
      3 //
      4 #include<iostream>
      5 #include<algorithm>
      6 #include<string>
      7 #include<iomanip>
      8 #include<memory.h>
      9 #include<time.h>
     10 #include<stdio.h>
     11 #include<stdlib.h>
     12 #include<string.h>
     13 #include<stdbool.h>
     14 #include<math.h>
     15 #define min(a,b) ((a)<(b)?(a):(b))
     16 #define max(a,b) ((a)>(b)?(a):(b))
     17 #define abs(a) ((a)>0?(a):(-(a)))
     18 #define lowbit(a) (a&(-a))
     19 #define sqr(a) ((a)*(a))
     20 #define swap(a,b) ((a)^=(b),(b)^=(a),(a)^=(b))
     21 #define eps 1e-8
     22 #define J 10
     23 #define MAX 0x7f7f7f7f
     24 #define PI 3.1415926535897
     25 #define N 207
     26 using namespace std;
     27 int n,m,lll,ans,cas;
     28 char map[2][N][N];
     29 bool u[N][N];
     30 bool f;
     31 void floodfill(int i,int j)
     32 {
     33     int t=0,k;
     34     if(u[i][j])return;
     35     u[i][j]=1;
     36     if(i>1 && j>1)
     37     {
     38         for(k=0;k<2;k++)
     39         {
     40             if(map[k][i-1][j-1]=='\' || map[k][i-1][j-1]=='X')
     41             {
     42                 t=t+(-2)*k+1;
     43                 f=1;
     44                 floodfill(i-1,j-1);
     45             }
     46         }
     47     }
     48     if(i>1 && j<=m)
     49     {
     50         for(k=0;k<2;k++)
     51         {
     52             if(map[k][i-1][j]=='/' || map[k][i-1][j]=='X')
     53             {
     54                 t=t+(-2)*k+1;
     55                 f=1;
     56                 floodfill(i-1,j+1);
     57             }
     58         }
     59     }
     60     if(i<=n && j>1)
     61     {
     62         for(k=0;k<2;k++)
     63         {
     64             if(map[k][i][j-1]=='/' || map[k][i][j-1]=='X')
     65             {
     66                 t=t+(-2)*k+1;
     67                 f=1;
     68                 floodfill(i+1,j-1);
     69             }
     70         }
     71     }
     72     if(i<=n && j<=m)
     73     {
     74         for(k=0;k<2;k++)
     75         {
     76             if(map[k][i][j]=='\' || map[k][i][j]=='X')
     77             {
     78                 t=t+(-2)*k+1;
     79                 f=1;
     80                 floodfill(i+1,j+1);
     81             }
     82         }
     83     }
     84     lll+=abs(t);
     85 }
     86 int main()
     87 {
     88     #ifndef ONLINE_JUDGE
     89 //    freopen("1.txt","r",stdin);
     90 //    freopen("2.txt","w",stdout);
     91     #endif
     92     int i,j,k;
     93 //    while(~scanf("%s",s1))
     94     while(~scanf("%d",&n))
     95 //    for(scanf("%d",&cas),l=1;l<=cas;l++)
     96     {
     97         memset(u,0,sizeof(u));
     98         ans=0;
     99         scanf("%d",&m);
    100         for(k=0;k<2;k++)
    101             for(i=1;i<=n;i++)
    102                 scanf("%s",map[k][i]+1);
    103         for(i=1;i<=n+1;i++)
    104         {
    105             for(j=1;j<=m+1;j++)
    106             {
    107                 lll=f=0;
    108                 floodfill(i,j);
    109                 if(f && lll==0)ans++;
    110                 else ans+=lll/2;
    111             }
    112         }
    113         printf("%d
    ",ans);
    114     }
    115     return 0;
    116 }
    117 
    118 /*
    119 //
    120 
    121 //
    122 */
    千万不要点
    并查集
      1 //
      2 //by coolxxx
      3 //
      4 #include<iostream>
      5 #include<algorithm>
      6 #include<string>
      7 #include<iomanip>
      8 #include<memory.h>
      9 #include<time.h>
     10 #include<stdio.h>
     11 #include<stdlib.h>
     12 #include<string.h>
     13 #include<stdbool.h>
     14 #include<math.h>
     15 #define min(a,b) ((a)<(b)?(a):(b))
     16 #define max(a,b) ((a)>(b)?(a):(b))
     17 #define abs(a) ((a)>0?(a):(-(a)))
     18 #define lowbit(a) (a&(-a))
     19 #define sqr(a) ((a)*(a))
     20 #define swap(a,b) ((a)^=(b),(b)^=(a),(a)^=(b))
     21 #define eps 1e-8
     22 #define J 10
     23 #define MAX 0x7f7f7f7f
     24 #define PI 3.1415926535897
     25 #define N 207
     26 using namespace std;
     27 int n,m,lll,ans,cas,cass;
     28 int a[N*N],b[N*N],fa[N*N],c[N*N];
     29 bool u[N*N],v[N*N];
     30 char map[2][N][N];
     31 int zhao(int aa)
     32 {
     33     if(fa[aa]==-1)return aa;
     34     return fa[aa]=zhao(fa[aa]);
     35 }
     36 int main()
     37 {
     38     #ifndef ONLINE_JUDGE
     39 //    freopen("1.txt","r",stdin);
     40 //    freopen("2.txt","w",stdout);
     41     #endif
     42     int i,j,k,x,y,fx,fy;
     43 //    while(~scanf("%s",s1))
     44     while(~scanf("%d",&n))
     45 //    for(scanf("%d",&cas),cass=1;cass<=cas;cass++)
     46     {
     47         memset(fa,-1,sizeof(fa));
     48         memset(a,0,sizeof(a));
     49         memset(b,0,sizeof(b));
     50         memset(u,0,sizeof(u));
     51         memset(v,0,sizeof(v));
     52         ans=0;c[0]=0;
     53         scanf("%d",&m);
     54         for(k=0;k<2;k++)
     55             for(i=0;i<n;i++)
     56                 scanf("%s",map[k][i]);
     57         for(k=0;k<2;k++)
     58         {
     59             for(i=0;i<n;i++)
     60             {
     61                 for(j=0;j<m;j++)
     62                 {
     63                     if(map[k][i][j]=='\' || map[k][i][j]=='X')
     64                     {
     65                         x=i*(m+1)+j;y=(i+1)*(m+1)+j+1;
     66                         fx=zhao(x);fy=zhao(y);
     67                         if(fx!=fy)
     68                             fa[fy]=fx;
     69                         a[x]+=(-2)*k+1;
     70                         a[y]+=(-2)*k+1;
     71                         v[x]=v[y]=1;
     72                     }
     73                     if(map[k][i][j]=='/' || map[k][i][j]=='X')
     74                     {
     75                         x=i*(m+1)+j+1;y=(i+1)*(m+1)+j;
     76                         fx=zhao(x);fy=zhao(y);
     77                         if(fx!=fy)
     78                             fa[fy]=fx;
     79                         a[x]+=(-2)*k+1;
     80                         a[y]+=(-2)*k+1;
     81                         v[x]=v[y]=1;
     82                     }
     83                 }
     84             }
     85         }
     86         for(i=0;i<(n+1)*(m+1);i++)
     87         {
     88             if(!v[i])continue;
     89             j=zhao(i);
     90             if(!u[j])u[j]=1,c[++c[0]]=j;
     91             b[j]+=abs(a[i]);
     92         }
     93         for(i=1;i<=c[0];i++)
     94         {
     95             if(b[c[i]]==0)ans++;
     96             else ans+=b[c[i]]/2;
     97         }
     98         printf("%d
    ",ans);
     99     }
    100     return 0;
    101 }
    102 
    103 /*
    104 //
    105 
    106 //
    107 */
    千万不要点
  • 相关阅读:
    关于EntityFramework的Migration
    JS从0开始——第二天笔记
    JS从0开始——第一天笔记
    前端之路从零开始——第二周第五天笔记(css属性)
    前端之路从零开始——第二周第四天笔记(background)
    前端之路从零开始——第二周第三天(定位)
    前端之路从零开始——第二周第二天笔记(盒子模型)
    前端之路从零开始——第二周第一天笔记(浮动)
    前端之路从零开始——第一周笔记
    *** 自写代码:字符串的排序及交换
  • 原文地址:https://www.cnblogs.com/Coolxxx/p/5503361.html
Copyright © 2011-2022 走看看