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

题目链接:https://codeforces.ml/contest/1196/problem/E

题意:给一个黑白相间的矩阵,第一个格子的白色, 然后每次询问 怎么样构成一个连通块,使得其中有 b 个黑色格子 w个白色格子

如果存在的话输出 所有构造的格子的坐标

思路: 好坑的题意,  题目中给的chessboard 默认就是黑白相间的一个棋盘, 其他地方真没读出来是黑白相间的棋盘

然后考虑如何构造, 要么是横着(或者竖着) 直线构造, 要么就是斜对角线构造, 发现直线的时候可以满足的情况更多

构造的时候 注意先 满足 联通的条件, 一条直线先串起来 在考虑左右两边的填补

 

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 #define ll long long
 4 #define pb push_back
 5 const int maxn =5e3+10;
 6 const int mod=1e9+7;
 7 
 8 
 9 
10 
11 int main()
12 {
13     ios::sync_with_stdio(false);
14     cin.tie(0);
15     int q;
16     cin>>q;
17     while(q--)
18     {
19         int b,w;
20         cin>>b>>w;
21         if(b*3+1<w||w*3+1<b)
22         {
23             cout<<"NO"<<'\n';
24         }
25         else
26         {
27             cout<<"YES"<<'\n';
28             if(b>w)
29             {
30                 int wx=2,wy=2;
31                 for(int i=0;i<w;i++)
32                 {
33                     cout<<wx<<" "<<wy<<'\n';
34                     cout<<wx<<" "<<wy+1<<'\n';
35                     wy+=2;
36                 }
37                 int tb=b-w;
38                 if(tb)
39                 {
40                     tb--;
41                     cout<<2<<" "<<1<<'\n';
42                 }
43                 int tx=1,ty=2;
44                 int nx=3,ny=2;
45                 for(int i=0;i<tb;i++)
46                 {
47                     if(i%2)
48                     {
49                         cout<<tx<<" "<<ty<<'\n';
50                         ty+=2;
51                     }
52                     else
53                     {
54                         cout<<nx<<" "<<ny<<'\n';
55                         ny+=2;
56                     }
57                 }
58 
59             }
60             else
61             {
62                 int wx=2,wy=3;
63                 for(int i=0;i<b;i++)
64                 {
65                     cout<<wx<<" "<<wy<<'\n';
66                     cout<<wx<<" "<<wy+1<<'\n';
67                     wy+=2;
68                 }
69                 int tw=w-b;
70                 if(tw)
71                 {
72                     tw--;
73                     cout<<2<<" "<<2<<'\n';
74                 }
75                 int tx=1,ty=3;
76                 int nx=3,ny=3;
77                 for(int i=0;i<tw;i++)
78                 {
79                     if(i%2)
80                     {
81                         cout<<tx<<" "<<ty<<'\n';
82                         ty+=2;
83                     }
84                     else
85                     {
86                         cout<<nx<<" "<<ny<<'\n';
87                         ny+=2;
88                     }
89                 }
90             }
91         }
92     }
93 
94 
95 
96 }
View Code

 

posted @ 2020-07-17 15:58  canwinfor  阅读(129)  评论(0)    收藏  举报