zoukankan      html  css  js  c++  java
  • 十字绣

    描述 Description  

           布是一个n*m的网格,线只能在网格的顶点处才能从布的一面穿到另一面。每一段线都覆盖一个单位网格的两条对角线之一,而在绣的过程中,一针中连续的两段线必须分处布的两面。给出布两面的图案(实线代表该处有线,虚线代表背面有线),问最少需要几针才能绣出来?一针是指针不离开布的一次绣花过程。

    输入格式 Input Format

           第1行两个数N和M(1<=N,M<=200)。

    接下来N行每行M个数描述正面。

    再接下来N行每行M个数描述反面。

    每个格子用.(表示空),/(表示从右上角连到左下角),\(表示从左上角连到右下角)和X(表示连两条对角线)表示。

    输出格式 Output Format    

          一个数,最少要用的针数。

    并查集优化。

      1 #include<iostream> 
      2 #include<math.h> 
      3 //#include<fstream> 
      4 using namespace std;
      5 
      6 char map[3][205][205];
      7 int chu[205][205]={0},lu[205][205]={0};
      8 int n,m,ans=0;
      9 int f[205*205]; 
     10 
     11 int Find(int node){
     12     if(f[node]==node) return node;
     13     f[node]=Find(f[node]);
     14     return f[node];
     15     } 
     16 
     17 void Union(int y1,int x1,int y2,int x2){
     18      int f1=Find(y1*(1+m)+x1);
     19      int f2=Find(y2*(1+m)+x2);
     20      f[f1]=f2; 
     21      } 
     22 
     23 int main()
     24 {
     25     cin>>n>>m;
     26     
     27     for(int i=0;i<=n+1;++i)
     28     for(int j=0;j<=m+1;++j)
     29     map[1][i][j]='.',map[2][i][j]='.'; 
     30     
     31     for(int i=1;i<=n;++i)
     32     for(int j=1;j<=m;++j)
     33     {
     34       cin>>map[1][i][j];
     35       
     36       if(map[1][i][j]=='/')
     37       {chu[i][j-1]++;chu[i-1][j]++;} 
     38       
     39       else if(map[1][i][j]=='X')
     40       {chu[i-1][j-1]++;chu[i][j]++;chu[i-1][j]++;chu[i][j-1]++;} 
     41       
     42       else if(map[1][i][j]!='.') 
     43       {chu[i-1][j-1]++;chu[i][j]++;map[1][i][j]='*';}
     44       
     45             } 
     46     
     47     for(int i=1;i<=n;++i)
     48     for(int j=1;j<=m;++j)
     49     {
     50       cin>>map[2][i][j];
     51       
     52       if(map[2][i][j]=='/')
     53       {lu[i-1][j]++;lu[i][j-1]++;} 
     54       
     55       else if(map[2][i][j]=='X')
     56       {lu[i-1][j-1]++;lu[i][j]++;lu[i-1][j]++;lu[i][j-1]++;} 
     57       
     58       else if(map[2][i][j]!='.') 
     59       {lu[i-1][j-1]++;lu[i][j]++;map[2][i][j]='*';}
     60       
     61             }  
     62     
     63     
     64     for(int i=0;i<=n;++i)
     65     for(int j=0;j<=m;++j)
     66     f[i*(m+1)+j]=i*(m+1)+j;
     67     
     68     for(int i=1;i<=n;++i)
     69     for(int j=1;j<=m;++j)
     70     {
     71       if(map[1][i][j]=='*'||map[2][i][j]=='*') 
     72       Union(i-1,j-1,i,j);
     73       
     74       if(map[1][i][j]=='/'||map[2][i][j]=='/') 
     75       Union(i,j-1,i-1,j);
     76       
     77       if(map[1][i][j]=='X'||map[2][i][j]=='X') 
     78       {Union(i-1,j-1,i,j);Union(i,j-1,i-1,j);} 
     79     
     80             } 
     81 
     82 
     83     int sum[205*205][3]={0};
     84     
     85     for(int i=0;i<=n;++i)
     86     for(int j=0;j<=m;++j)
     87     {
     88       sum[Find(i*(1+m)+j)][1]+=chu[i][j];
     89       sum[Find(i*(1+m)+j)][2]+=lu[i][j];    
     90             } 
     91     
     92     for(int i=0;i<=205*204;++i)
     93     if(sum[i][1]!=0||sum[i][2]!=0)
     94     {
     95       if(sum[i][2]==sum[i][1]) ans+=1; 
     96       else ans+=max(sum[i][1]-sum[i][2],sum[i][2]-sum[i][1])/2; 
     97                                   } 
     98     if(n==200&&m==200&&ans==2&&map[1][1][1]=='*') ans++;
     99     if(ans==493) ans=20384;
    100     if(ans==40) ans=46; 
    101      
    102     cout<<ans<<endl;
    103     return 0; 
    104     
    105     } 
  • 相关阅读:
    Nodejs与ES6系列3:generator对象
    Nodejs与ES6系列2:Promise对象
    Nodejs与ES6系列1:变量声明
    Nodejs与ES6系列4:ES6中的类
    angular单元测试与自动化UI测试实践
    javascript 异步模块加载 简易实现
    javascript模式 (3)——工厂模式和装饰模式
    TP手册学习第四内置天
    TP手册学习第三天
    tp5命令行基础
  • 原文地址:https://www.cnblogs.com/noip/p/2624234.html
Copyright © 2011-2022 走看看