您的位置:首页 > 产品设计 > UI/UE

CodeForces 26 C.Parquet(构造)

2017-12-23 13:13 246 查看
Description

用a个1×2的,b个2×1的和c个2×2的砖铺n×m的地板,问是否存在一个合法方案

Input

五个整数n,m,a,b,c(1≤n,m≤100,0≤a,b,c≤104)

Output

如果存在合法方案则输出(用相同字母表示一块砖,相邻的不同的砖用不同字母),否则输出IMPOSSIBLE

Sample Input

2 6 2 2 1

Sample Output

aabcca

aabdda

Solution

构造题,n,m均为奇数显然不行,有一个是奇数则看用对应的1×2或2×1的砖能否把多出的一列或一行铺满然后变成都是偶数的情况,都是偶数时就看砖的数量够不够了(此时1×2和2×1的砖两两凑成2×2的)

Code

#include<cstdio>
#include<iostream>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<vector>
#include<queue>
#include<map>
#include<set>
#include<ctime>
using namespace std;
typedef long long ll;
typedef pair<int,int>P;
const int INF=0x3f3f3f3f,maxn=110;
char s[maxn][maxn];
int n,m,a,b,c;
char get(int i,int j)
{
for(char c='a';c<='z';c++)
if(c!=s[i-1][j]&&c!=s[i][j-1]&&c!=s[i-1][j+1]&&c!=s[i+1][j-1])return c;
}
int Solve()
{
int nn=0,mm=0;
if(n&1)
{
if(m&1)return 0;
if(a<m/2)return 0;
a-=m/2;
for(int j=1;j<m;j+=2)s[1][j]=s[1][j+1]=get(1,j);
nn++;
}
else
{
if(m&1)
{
if(b<n/2)return 0;
b-=n/2;
for(int i=1;i<n;i+=2)s[i][1]=s[i+1][1]=get(i,1);
mm++;
}
}
if(a/2+b/2+c<(n-nn)*(m-mm)/4)return 0;
for(int i=nn+1;i<n;i+=2)
for(int j=mm+1;j<m;j+=2)
{
if(a>=2)
{
a-=2;
s[i][j]=s[i][j+1]=get(i,j);
s[i+1][j]=s[i+1][j+1]=get(i+1,j);
}
else if(b>=2)
{
b-=2;
s[i][j]=s[i+1][j]=get(i,j);
s[i][j+1]=s[i+1][j+1]=get(i,j+1);
}
else
s[i][j]=s[i+1][j]=s[i][j+1]=s[i+1][j+1]=get(i,j);
}
return 1;
}
int main()
{
while(~scanf("%d%d%d%d%d",&n,&m,&a,&b,&c))
{
if(Solve()==0)printf("IMPOSSIBLE\n");
else
{
for(int i=1;i<=n;i++)
{
for(int j=1;j<=m;j++)printf("%c",s[i][j]);
printf("\n");
}
}
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: