题解:P15042 [UOI 2022 II Stage] 双色图形
题意简述:放黑白格子,相邻格子不能同色,放的所有格子必须联通。
构造题。
构造方法:令需要放置的白格数量大于黑格。先放一排白格黑格交替,首尾都是白格(因为白格数量多),这样白格就比黑格多放一个。然后再在每一个黑格的上下两边放白格,放完即可,放不完就无解。
这样构造能尽可能多的放置白格。
由于这样的构造只需要三行,所以我们可以用三个字符串来记录答案。
注意如果黑格数量等于白格数量,则直接放置一排黑白交替的(首黑尾白)。
上代码:
#include<bits/stdc++.h>
using namespace std;
int w,b,m,a[3][10010];
char W='W',B='B';
string s1,s2,s3;
int main()
{
cin>>w>>b;
if(w==b)
{
cout<<1<<' '<<w*2<<'\n';
for(int i=1;i<=w;i++)
{
cout<<W<<B;
}
//交替输出
return 0;
}
if(w<b)
{
swap(w,b);
swap(W,B);
}
//令需要放置的白格数量大于黑格
s2+=W;
w--;
m++;
//开头放白
while(b--)
{
s2+=B;
w--;
s2+=W;
m+=2;
}
//然后黑白交替地放
for(int i=0;i<m;i++)
{
if(!w)
{
s1+='.';
//放完就不用放了
}
else
{
if(i%2==0)
{
s1+='.';
}
else
{
s1+=W;
w--;
}
//只有这格下方是黑才能填白
}
}
for(int i=0;i<m;i++)
{
if(!w)
{
s3+='.';
}
else
{
if(i%2==0)
{
s3+='.';
}
else
{
s3+=W;
w--;
}
}
}
//上下两行填没放完的白
if(w)
{
cout<<-1;
return 0;
}
//没放完就无解
cout<<3<<' '<<m<<'\n'<<s1<<'\n'<<s2<<'\n'<<s3;
return 0;
}
这样就AC了。