• Codeforces Round #575 (Div. 3) E. Connected Component on a Chessboard


    传送门

    题意:

    给你一个黑白相间的1e9*1e9的棋盘,你需要从里面找出来由b个黑色的格子和w个白色的格子组成的连通器(就是你找出来的b+w个格子要连接在一起,不需要成环)。问你可不可以找出来,如果可以就先打印YES,再打印出所有格子的坐标,否则打印出NO。

    题解:

    参考博客

    如果b和w相等的时候,那么就可以用棋盘的一行来表示。

    对于不相等的情况:

    如果max(w,b)>min(w,b)*3+1那么这样是找出不来符合条件的连通区域的。

    看图中的红色部分你会知道只有这样十十的连接起来才是最大构成情况(这样写代码其实并不麻烦,你不需要一个十一个十的来拼接,可以看一下代码)

    就这个十十的拼接可以就是一个十一个十的先拼接,之后多余出来的颜色格子,就用bfs添加到十的周围,但是代码确实太麻烦了

    代码:

     1 #include<stdio.h>
     2 #include<string.h>
     3 #include<iostream>
     4 #include<algorithm>
     5 #include<map>
     6 #include<math.h>
     7 using namespace std;
     8 typedef long long ll;
     9 const int maxn=1e5+5;
    10 const int mod=26;
    11 const int INF=0x3f3f3f3f;
    12 const int block=300;
    13 int cnt1=0,cnt2=0;
    14 int main()
    15 {
    16     int t;
    17     scanf("%d",&t);
    18     while(t--)
    19     {
    20         int w,b;
    21         scanf("%d%d",&b,&w);//b黑色  w白色
    22         if(max(w,b)>min(w,b)*3+1)
    23         {
    24             printf("NO
    ");
    25             continue;
    26         }
    27         if(w==b)
    28         {
    29             printf("YES
    ");
    30             for(int i=3; i<=w+b+2; ++i)
    31                 printf("5 %d
    ",i);
    32         }
    33         else if(b<w)
    34         {
    35             printf("YES
    ");
    36             w=w-b-1;//将在一行的减掉
    37             for(int i=4; i<=b*2+4; i++)
    38             {
    39                 printf("4 %d
    ",i);
    40                 if(w>0 && i&1)
    41                 {
    42                     printf("3 %d
    ",i);
    43                     w--;
    44                 }
    45                 if(w>0  && i&1 )
    46                 {
    47                     printf("5 %d
    ",i);
    48                     w--;
    49                 }
    50             }
    51         }
    52         else if(b>w)
    53         {
    54             swap(b,w);
    55             printf("YES
    ");
    56             w=w-b-1;//将在一行的减掉,再对这一行的某些部分添加格子变成十
    57             for(int i=4; i<=b*2+4; i++)
    58             {
    59                 printf("3 %d
    ",i);
    60                 if(w>0 && i&1)
    61                 {
    62                     printf("2 %d
    ",i);
    63                     w--;
    64                 }
    65                 if(w>0  && i&1 )
    66                 {
    67                     printf("4 %d
    ",i);
    68                     w--;
    69                 }
    70             }
    71         }
    72     }
    73     return 0;
    74 }
    View Code
  • 相关阅读:
    二叉树基本操作(二)
    二叉树基本操作(一)
    数组的方式实现--栈 数制转换
    数据的插入与删除
    链表 创建 插入 删除 查找 合并
    ACM3 求最值
    ACM2 斐波那契数列
    ACM_1 大数求和
    简单二维码生成及解码代码:
    ORM中去除反射,添加Expression
  • 原文地址:https://www.cnblogs.com/kongbursi-2292702937/p/11532175.html
Copyright © 2020-2023  润新知