学习C++从娃娃抓起!记录下在学而思小猴编程学习过程中的题目,记录每一个瞬间。侵权即删,谢谢支持!
附上汇总贴:小猴编程C++ | 汇总-CSDN博客
【题目描述】
小猴在扫描二维码登录某一个网页时,发现尝不论以怎样的角度,比如倒着、斜着、横着等,都可以很快识别二维码。小猴很好奇,通过他查阅大量资料之后,终于明白其中的原理。简单来说,二维码内是有三个定位点,每次扫描的时候会根据定位点将二维码进行旋转,再识别信息。
我们简化一下问题,现在研究一下只通过与二维码水平和竖直的方向进行扫描,那么在扫码过程中会出现以下四个不同情况:
注:红色框起来的均为二维码内的定位点。
上述四种情况最后旋转的结果都为:
给定你一个
n
×
n
n\times n
n×n矩阵a,矩阵a只包含0、1和#,用来表示二维码,其中#表示二维码中的定位点,保证矩阵a中只有三个#且均在矩阵的顶角处。
例如
3
×
3
3\times3
3×3的二维码:
#1#
101
#01
请你帮助小猴计算给定"二维码"最终旋转的结果(即三个#分别在左上角、右上角、左下角)
【输入】
第一行,包含一个整数n;
接下来n行,每行包含一个长度为n的字符串。
【输出】
输出包含n行,每行一个长度为n字符串,表示该"二维码"最终旋转的结果。
【输入样例】
3
#1#
101
#01
【输出样例】
#1#
101
#01
【代码详解】
#include <bits/stdc++.h>
using namespace std;
const int N = 1e3+10;
int n;
string s[N];
void print1() // 原样输出
{
for (int i=0; i<n; i++) cout << s[i] << endl;
}
void print3() // 逆时针90°输出
{
for (int j=n-1; j>=0; j--) {
for (int i=0; i<n; i++) {
cout << s[i][j];
}
cout << endl;
}
}
void print2() // 顺时针90°输出
{
for (int j=0; j<n; j++) {
for (int i=n-1; i>=0; i--) {
cout << s[i][j];
}
cout << endl;
}
}
void print4() // 旋转180°输出
{
for (int i=n-1; i>=0; i--) {
for (int j=n-1; j>=0; j--) {
cout << s[i][j];
}
cout << endl;
}
}
int main()
{
cin >> n;
for (int i=0; i<n; i++) {
cin >> s[i];
}
if (s[0][0]=='#' && s[0][n-1]=='#') { // 判断左上角和右上角
if (s[n-1][0]=='#') print1(); // 如果左下角为'#',则原样输出
else print3(); // 否则逆时针90°输出
}
else if (s[0][0]=='#') print2(); // 此时需要顺时针90°转换
else print4(); // 旋转180°
return 0;
}
【运行结果】
#1#
101
#01
#1#
101
#01