题目
本题要求对经过加密的字符矩阵进行解密。输入包含矩阵大小、内容以及一组密钥,需通过逆向执行加密操作还原原始矩阵。
初步尝试与优化
在实现过程中,若仅使用简单的顺时针旋转函数(转 180 度调用 2 次,转 270 度调用 3 次),虽然逻辑正确,但在部分测试点上会出现超时(TLE)。
通过引入标准库函数 memcpy 和 std::reverse 进行常数优化后,性能得到显著提升。memcpy 利用底层指令集处理大块内存,reverse 优化了数组反转逻辑,相比手写循环效率更高。此方案可获得较高分数,但仍存在进一步优化空间。
程序核心逻辑如下:
- 数据结构:使用二维字符数组存储矩阵,下标从 1 开始。
- 操作类型:支持上下/左右翻转及顺时针旋转 90°/180°/270°。
- 执行流程:读取密钥序列,从后向前逆序执行每组操作参数。
- 输出结果:定位左上角连续非问号区域并输出。
代码实现
#include<bits/stdc++.h>
using namespace std;
#define endl '\n'
const int Z=405;
char a[Z][Z]; // 主矩阵,下标从 1 开始
char b[Z][Z]; // 辅助矩阵,用于旋转临时存储
int z; // 当前矩阵边长
void print() {
for(int i=1;i<=z;i++){
for(int j=1;j<=z;j++) cout<<a[i][j];
cout<<endl;
}
}
int ui,di,li,ri,oi;
// 翻转操作
void decodeFan() {
if(oi==1) { // 上下翻转
for( i=;i<=(di-ui)/;i++) {
( j=li;j<=ri;j++) {
(a[ui+i][j],a[di-(i)][j]);
}
}
} {
( i = ui; i <= di; i++) {
(&a[i][li], &a[i][ri + ]);
}
}
}
{
(t==) ;
(t==) {
( i = ; i <= l; i++) {
( j = ; j <= l; j++) {
b[j][l-i] = a[x+i][y+j];
}
}
} (t==) {
( i = ; i <= l; i++)
( j = ; j <= l; j++) {
b[l-i][l-j] = a[x+i][y+j];
}
} (t==) {
( i = ; i <= l; i++) {
( j = ; j <= l; j++) {
b[l-j][i] = a[x+i][y+j];
}
}
}
( i = ; i <= l; i++) {
(&a[x + i - ][y], &b[i][], l*());
}
}
vi;
{
ri = vi;
ri = ri % ;
(ri!=) (,,z,ri);
ni_ri=(di/)%;
(ui,vi,li,-ni_ri);
}
{
cin>>z;
( i=;i<=z;i++) {
string s; cin>>s;
( j=;j<=z;j++) a[i][j]=s[j];
}
k; cin>>k;
keys[k]={};
( i=;i<k;i++) cin>>keys[i];
( i=k;i>=;i-=) {
op=keys[i];
(op==) {
ui=keys[i],di=keys[i], li=keys[i],ri=keys[i],oi=keys[i];
();
} {
ui=keys[i],vi=keys[i], li=keys[i],di=keys[i],ri=keys[i];
();
}
}
n=,m=;
(a[][m]!=&&m<=z) m++;
(a[n][]!=&&n<=z) n++;
cout<<n<<<<m<<endl;
( i=;i<=n;i++) {
( j=;j<=m;j++) cout<<a[i][j];
cout<<endl;
}
}
{
ios::(),cin.();
();
;
}


