P7049 [NWRRC2015] Black and White
gaoyangyang · · 题解
会解题的前提是知题意
翻译
题目描述(精简版)
给定正整数
输入格式
输入仅有一行,包含
输出格式
输出的第一行包含两个整数
题解
看到这道题我们的第一反应应该是将问题简单化。在这里我们将问题分为两个部分:
- 构建矩阵
- 输出规格
首先我们先考虑构建矩阵,我们不妨先不考虑黑和白,先想如何构建一个单一符号矩阵,如下:
@@
@@
@@
@@
@@
//这是一个有@组成的2*5矩阵
想必大家都会,并且在这里还可少考虑一个“列”的因素(因为矩阵大小自定,所以满足题目条件只需调整“行”而不用考虑“列”),在这里我用
for (int i=0;i<n;i++)
{
cout<<"@@"<<endl;
}
//n为行数
接下来,我们考虑符号,这里要考虑两种情况:
-
w$ 等于 $b -
我们先考虑第一种,
//b=2,w=2
@@
..
@@
..
//————华丽分割线————
..
@@
..
@@
代码实现:
for (int i=0;i<(w+b)/2;i++)
{
cout<<"@@"<<endl;
cout<<".."<<endl;
}
//n为行数
接下来是第二种
//b=1,w=3
@@
.@
@@
.@
@@
.@
@@
//反之
代码实现:
for (int i=0;i<w;i++)
{
cout<<"@@"<<endl;
cout<<".@"<<endl;
}cout<<"@@";
接着我们就会发现任何的
下方是矩阵构造的代码:
//思路是一样的,这里为了方便书写采用while循环
while (w!=0 or b!=0)
{
if (b>w)
{
while (w>1 and b>1)
{
cout<<"@@"<<endl;
b--;
cout<<".."<<endl;
w--;
}
if (w==1)
{
w--;
cout<<"@@"<<endl;
while (b!=0)
{
cout<<".@"<<endl;
cout<<"@@"<<endl;
b--;
}
}
}
else
{
while (w>1 and b>1)
{
cout<<".."<<endl;
w--;
cout<<"@@"<<endl;
b--;
}
if (b==1)
{
b--;
cout<<".."<<endl;
while (w!=0)
{
cout<<"@."<<endl;
cout<<".."<<endl;
w--;
}
}
}
}
接下来我们考虑第二块:输出规格。
同上将矩阵分成两个部分,就可以得出:
部分一的大小为
部分二的大小为
我们再相加,就可得出
”行“我们就解决了,我们再将列人为的定为
至此这道题我们就解决了,下面上代码!!!
#include<bits/stdc++.h>
using namespace std;
int main()
{
int w,b;
cin>>w>>b;
cout<<(min(w,b)-1)*2+1+(max(w,b)-min(w,b)+1)*2<<" "<<2<<endl;
while (w!=0 or b!=0)
{
if (b>w)
{
while (w>1 and b>1)
{
cout<<"@@"<<endl;
b--;
cout<<".."<<endl;
w--;
}
if (w==1)
{
w--;
cout<<"@@"<<endl;
while (b!=0)
{
cout<<".@"<<endl;
cout<<"@@"<<endl;
b--;
}
}
}
else
{
while (w>1 and b>1)
{
cout<<".."<<endl;
w--;
cout<<"@@"<<endl;
b--;
}
if (b==1)
{
b--;
cout<<".."<<endl;
while (w!=0)
{
cout<<"@."<<endl;
cout<<".."<<endl;
w--;
}
}
}
}
return 0;
}