本文主要是介绍ccsu oj 1509 Build the given towers,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
题目大意:
有三种正方形的1*1的方块,颜色分别为红黄蓝,用0,1,2表示,还有一种1*2的灰色方块(它只能竖着摆),用b表示,先给定一串字符串,和能摆放的宽度和每种方块的数量,判断能否合理的摆放这些方块,使得从左往右看能摆出字符串要求的形状。
模拟题,从右往左摆,从上往下摆,遇到奇数个b就重新开辟一行,宽度随之增加。模拟摆方格的过程,并且判断方格的个数和摆放宽度是否满足要求。
Sample Input
1 1 1
1
2
6
012
012bb
bb0
21bb
21b
1bb20
Sample Output
valid
valid
valid
valid
valid
valid
#include<stdio.h>
#include<string.h>
int rest[100];
char str[50];
int cube[4];
int a,b,c,d,wide,w,n;
int main()
{
while(scanf("%d%d%d%d%d%d",&a,&b,&c,&d,&wide,&n)!=EOF)
{
while(n--)
{
scanf("%s",str);
int w=1;
bool flag = true;
int len=strlen(str);
memset(rest,0,sizeof(rest));
cube[0]=a,cube[1]=b,cube[2]=c,cube[3]=d;
for(int i=len-1;i>=0;i--)
{
if(str[i]=='0'||str[i]=='1'||str[i]=='2')
{
cube[str[i]-'0']--;
if(cube[str[i]-'0']<0) {flag=false; break;}
}
else if(str[i]=='b')
{
if(i==0) { flag=false; break; }
int sum=0;
while(i>=0&&str[i]=='b') { sum++; i--;}
i++;
cube[3]-=(sum+1)/2;
if(sum%2)
{
if(i>0) rest[w]=(i-1);
else rest[w]=1;
w++;
}
}
}
if(w>wide) flag=false;
int tot=0,ans=0;
for(int i=1;i<=w;i++)
{
tot+=rest[i]/2;
ans+=rest[i]%2;
}
tot-=cube[3]; if(tot<0) tot=0;
if(ans+tot*2>cube[0]+cube[1]+cube[2]) flag=false;
if(flag) printf("valid\n");
else printf("invalid\n");
}
}
return 0;
}
这篇关于ccsu oj 1509 Build the given towers的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!