Luogu P2129 小Z的情书
Luogu P2129 小Z的情书
题目
【题目背景】
众所周知,小Z是高富帅的典范和代表,所以他很很多很多的妹纸。小Z要写情书给他的妹纸了,作为一个谨慎的人,他当然不会直白的写在纸上(否则被那群损友发现岂不糟了?)。
【题目描述】
虽然小Z谨小慎微,但是还是被狡猾的小D给发现了其中的玄机。作为一个大方的人,小D自然要把这个秘密拿出来给大家共享啦~小Z开始有两张N*N大小的纸一张是透明的、一张是有字的。然后小Z把透明的纸上有些格子涂黑了。接着把这两张纸一起给他的妹纸,妹纸事先和小Z约定好了,按照如下方法阅读:首先先把透明的纸盖在另一张纸上,然后把露出来的字母从上到下从左到右写下来,然后转个90度,再读一遍……这样子一共读四遍……详见样例。
小D不知从哪把情书弄来了,请大家一起来欣赏,顺便请大家把内容打出来看看。
【输入输出格式】
输入格式:
第1行,一个整数N;
第2到第N+1行,每行N个字符,代表skj的透明纸,“O”没有涂黑的地方,“#”代表被涂黑的地方;
第N+2到第2N+1行,每行N个字符,仅包含大写字母,如描述中所示,是另一张纸。
输出格式:
一行,情书的内容。
【输入输出样例】
输入样例#1:
4
##O#
#O#O
####
###O
ARAO
PCEM
LEEN
TURC
输出样例#1:
ACMCENTRALEUROPE
【数据规模】
\(1 \leq N \leq 1000\)
思路
模拟,注意旋转90°的公式。
代码
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<queue>
#define FILE freopen("loveletter.in","r",stdin);freopen("loveletter.out","w",stdout);
using namespace std;
const int maxn=1000+5;
inline int read() {
int ans=0,flag=1;
char ch=getchar();
while(ch<'0' || ch>'9') {
if(ch=='-')
flag=-1;
ch=getchar();
}
while(ch>='0' && ch<='9') {
ans=ans*10+(int)(ch-'0');
ch=getchar();
}
return ans*flag;
}
int n,cnt=1;
char card[maxn][maxn];
char lov[maxn][maxn];
char ans[maxn*maxn*4];
inline void print(bool a) {
if(a) {
for(int i=1; i<=n; i++) {
for(int j=1; j<=n; j++)
cout<<card[i][j];
cout<<endl;
}
} else {
}
}
inline void change90() {
char temp[maxn][maxn];
for(int i=1; i<=n; i++)
for(int j=1; j<=n; j++)
temp[j][n-i+1]=card[i][j];
for(int i=1; i<=n; i++)
for(int j=1; j<=n; j++)
card[i][j]=temp[i][j];
}
inline void check() {
for(int i=1; i<=n; i++) {
for(int j=1; j<=n; j++) {
if(card[i][j]=='O')
cout<<lov[i][j];
}
}
}
int main() {
ios::sync_with_stdio(false);
cin>>n;
for(int i=1; i<=n; i++)
for(int j=1; j<=n; j++)
cin>>card[i][j];
for(int i=1; i<=n; i++)
for(int j=1; j<=n; j++)
cin>>lov[i][j];
check();
change90();
check();
change90();
check();
change90();
check();
return 0;
}