HDU-7310 2023“钉耙编程”杭电多校赛(3)8-bit Zoom

2023“钉耙编程”中国大学生算法设计超级联赛(3)8-bit Zoom

题解

有一张尺寸为 n × n n\times n n×n的图片,你要将图片放大成大小为 n Z 100 × n Z 100 \dfrac{nZ}{100}\times \dfrac{nZ}{100} 100nZ×100nZ的图片。

当下列任何一个条件不成立时,图片不能放大成上述的图片:

  • n Z 100 \dfrac{nZ}{100} 100nZ不是整数
  • 在放大的图片中,无法确定某些像素的颜色

给出图片,求能否放大成上述的图片。如果可以的话,输出放大后的图片;否则,输出 error \text{error} error

T T T组数据。

1 ≤ T ≤ 10 , 1 ≤ n ≤ 50 , 100 ≤ Z ≤ 200 , Z % 25 = 0 1\leq T\leq 10,1\leq n\leq 50,100\leq Z\leq 200,Z\% 25=0 1T10,1n50,100Z200,Z%25=0


题解

先判断 n Z 100 \dfrac{nZ}{100} 100nZ是不是整数,不是的话输出 error \text{error} error

先将图放大 Z 25 \dfrac{Z}{25} 25Z倍,这样的话,原图的每个 1 × 1 1\times 1 1×1的格子在放大后的图中变为 Z 25 × Z 25 \dfrac{Z}{25}\times \dfrac{Z}{25} 25Z×25Z的格子。

然后,将图片缩到原来的 1 4 \dfrac 14 41,将每个 4 × 4 4\times 4 4×4的部分变为一个格子。如果出现一个 4 × 4 4\times 4 4×4的部分存在两个像素的颜色不相同的情况,则不合法,输出 error \text{error} error

放大 Z 25 \dfrac{Z}{25} 25Z倍后再缩到原来的 1 4 \dfrac 14 41,也就是将原图放大 Z 100 \dfrac{Z}{100} 100Z倍,符合题意。如果经过放大在缩小后的图合法,则将最后的图输出即可。

时间复杂度为 O ( n 2 ) O(n^2) O(n2)

code

#include<bits/stdc++.h>
using namespace std;
int t,n,Z,w,fl;
char a[105][105],b[505][505];
char gt(){
	char ch=getchar();
	while(ch<'a'||ch>'z') ch=getchar();
	return ch;
}
int main()
{
	scanf("%d",&t);
	while(t--){
		scanf("%d%d",&n,&Z);
		for(int i=1;i<=n;i++){
			for(int j=1;j<=n;j++){
				a[i][j]=gt();
			}
		}
		if(n*Z%100!=0){
			printf("error\n");
			continue;
		}
		w=Z/25;
		for(int i=1;i<=n;i++){
			for(int j=1;j<=n;j++){
				for(int k=(i-1)*w+1;k<=i*w;k++){
					for(int l=(j-1)*w+1;l<=j*w;l++){
						b[k][l]=a[i][j];
					}
				}
			}
		}
		fl=0;
		for(int i=1;i<=n*w;i+=4){
			for(int j=1;j<=n*w;j+=4){
				for(int k=0;k<4;k++){
					for(int l=0;l<4;l++){
						if(b[i+k][j+l]!=b[i][j]) fl=1;
					}
				}
			}
		}
		if(fl) printf("error\n");
		else{
			for(int i=1;i<=n*w;i+=4){
				for(int j=1;j<=n*w;j+=4){
					printf("%c",b[i][j]);
				}
				printf("\n");
			}
		}
	}
	return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值