绿地装饰
题目描述
湖南中医药大学坐落于中国历史文化名城长沙,是湖南省重点建设本科院校,是全国首批设立国家级重
点学科的高校,也是首批招收博士研究生、留学生及港澳台学生的中医药院校。学校现有 2 个校区,占
地面积 1393 亩,建筑面积 52 万平方米,主校区依岳麓南坡,临湘江西岸,环境幽雅,风光秀丽,是求
学成才的理想之地。
校园景观设计师小 W 的主要工作就是植被环境的设计维护,他有一个 N×N 的模板图,他创作景观的步
骤如下:
1、将当前的绿地分成 N×N 小块,再按照模板图添加装饰(黑色表示有装饰,白色表示没有);
2、对于每个白色(未被装饰)的地块,递归操作 1,应用模板图,即分成更小的 N×N 块,继续进行装
饰,而黑色(已装饰)的地块则不必操作。
下图是某次装饰过程的示意图。
现在你的任务是求出 K 次递归后的绿地状态。
输入
单组数据。
第一行两个数 N,K,如题意中的描述。
接下来是一个 N×N 的模板图,’ . ’ 表示白色,’ * ’ 表示黑色。
2 ≤ n ≤ 3
1 ≤ k ≤ 5
输出
输出一个 N K×N K 的矩阵表示答案,不允许有多余的空行或空格。
样例输入
2 3
.*
..
样例输出
.*******
..******
.*.*****
....****
.***.***
..**..**
.*.*.*.*
........
ps:
这个题目刚刚看的时候以为就是一个简单的递归,后面实打实的被打脸,发现自己不会做。所以偷偷看大佬的题解,这个题目真心不错,看完之后久久不能~,所以特地来写一篇详细的题解。首先详细讲解一下非递归的代码,看完题目我们本能的想到用递归去做,确实,这非常符合递归,但是我想先说一下非递归的代码,因为这段代码花了我很长时间来理解。这段代码最主要的思想就是通过一个点构造一个2*2的矩阵,因为矩阵的大小是以2倍增长的,附上本人手工图, 第一次画,所以很丑很丑,溜了。
上面的图所代表的的思想就是下面代码实现的
#include <bits/stdc++.h>
using namespace std;
char w[300][300], ans[300][300], ww[8][8];
int main()
{
int n, k, m;
while (~scanf("%d%d", &n, &k))
{
for (int i = 0; i < n; ++i)
scanf("%s", ww[i]);
w[0][0] = '.'; //初始化
m = 1; //从一个点开始
while (k--)
{
for (int i = 0; i < m; ++i)
for (int j = 0; j < m; ++j)
if (w[i][j] == '.') //一个点变成四个点,每个点只做好自己的事就可以了
{
for (int a = 0; a < n; ++a)
for (int b = 0; b < n; ++b)
ans[i * n + a][j * n + b] = ww[a][b];
}
else
{
for (int a = 0; a < n; ++a)
for (int b = 0; b < n; ++b)
ans[i * n + a][j * n + b] = '*';
}
m = m * n; //每次变换都是原先的两倍
for (int i = 0; i < m; ++i)
for (int j = 0; j < m; ++j)
w[i][j] = ans[i][j]; //把得到的结果赋给另一个数组方便下一次变换
}
for (int i = 0; i < m; ++i)
printf("%s\n", ans[i]);
}
return 0;
}
递归
递归算法真的很难懂,只能自己理解!!!
将问题递归下去,化成很多个小的子问题再进行填数
void solve(int a, int b, int x,int len)表示对左上角为(a,b)层数为x,矩形边长为len的矩形填数
ps:
对于这个题目而言,区别就是填矩阵不同,与输出不同,它只会填满的是以一个点变成三个点和一个星星的矩阵,并不会填以一个星星变成四个星星的矩阵,所以我们要初始化所有的点都为星星,这样弥补了之前的不足,但是也正是因为这个原因,我们不能像非递归代码那样,用字符串输出,只能一个一个字符输出,因为我们把整个ans数组初始化了!!
#include <bits/stdc++.h>
using namespace std;
char ans[1005][1005], w[10][10];
int n, k;
void solve(int a, int b, int x, int len)
{
len /= n;
if (x == 1)
{
//如果已经到最后一层,填数,return
for (int i = 1; i <= n; ++i)
for (int j = 1; j <= n; ++j)
ans[i + a - 1][j + b - 1] = w[i][j];
return;
}
for (int i = 1; i <= n; ++i)
for (int j = 1; j <= n; ++j)
if (w[i][j] == '.')
{
//如果是.递归填数
int aa = a + (i - 1) * len, bb = b + (j - 1) * len;
solve(aa, bb, x - 1, len);
}
}
int main()
{
while (~scanf("%d %d", &n, &k))
{
int len = pow(n, k);
memset(ans, '*', sizeof(ans)); //默认全部填上*
for (int i = 1; i <= n; ++i)
scanf("%s", w[i] + 1); //从数组元素下标为1开始填数
solve(1, 1, k, len);
for (int i = 1; i <= len; ++i)
{
for (int j = 1; j <= len; ++j)
printf("%c", ans[i][j]);
putchar('\n');
}
}
return 0;
}
解密
题目描述
湖南中医药大学有含浦、东塘 2 个校区,学校办学历史悠久,前身为 1934 年的湖南国医专科学校,1953
年创办湖南中医进修学校,1960 年创建普通高等本科院校——湖南中医学院,1979 年成为全国首批取得
中医类研究生学历教育资格的院校,1990 年原湖南科技大学成建制并入湖南中医学院,2002 年与湖南省
中医药研究院合并,2006 年经教育部批准更名为湖南中医药大学,2012 年进入湖南省一本招生序列。
目前,学校与湖南省中医药研究院实行校院合一的管理体制。学校学科门类齐全、中医药特色鲜明。学校
设有 18 个学院、24 个本科专业,涵盖医、理、工、管、文等 5 大学科门类。中医诊断学在本学科研究领
域居国内领先水平。
小 F 居住在含浦校区,他想和东塘校区的同学小 L 聊天,为了保证沟通安全,他发明了一种加密方式,这
种加密方式是这样的:对于一个 01 串,小 F 会将其从左到右每 8 位分成一组,最后一组可能不足 8 位,
对每组进行逆序操作,即如果原来是 bLbL+1bL+2 · · · bR−1bR, 逆序之后变成 bRbR−1bR−2 · · · bL−1bL。现在
小 F 已经加密好了一个串,并且将其发给了小 L,你能帮助小 L 得到这串密文对应的原始信息吗?
输入
单组数据。
一行一个 01 串,代表加密后的字符串,串长度大于 0, 小于等于 100。
输出
一行字符串,代表加密后的字符串所对应的原始信。
样例输入
100010110011101
样例输出
110100011011100
ps:刚刚开始看的时候以为这是一个水题,其实它就是一个水题,但是当时连着wa了三发,这一下子让我冷静下来仔细思考,虽然思考后过了题目,但是事后看大佬的代码的时候我发现自己想的太复杂了,大佬简直了!此处膜拜~,下面附上我的和大佬的代码,为了表示尊敬,大佬最后出场,嘿嘿(坏笑)。
#include <bits/stdc++.h>
using namespace std;
const int maxn = 1e6 + 10;
int a[maxn];
char c[110];
int main()
{
while (~scanf("%s", c))
{
int ls = strlen(c);
int m = 0;
while (m < ls)
{
m += 8;
if (m <= ls)
for (int i = m - 1; i >= m - 8; --i)
printf("%c", c[i]);
else
{
for (int i = ls - 1; i >= ls - (ls % 8); --i)
printf("%c", c[i]);
}
}
printf("\n");
}
return 0;
}
这是大佬的代码
#include <bits/stdc++.h>
using namespace std;
int main()
{
char c[1010];
while (~scanf("%s", c))
{
int lc = strlen(c);
for (int i = 0; i < lc; i += 8)
{
for (int j = min(i + 7, lc - 1); j >= i; --j)
printf("%c", c[j]);
}
printf("\n");
}
return 0;
}
emmmm,相比之下,我简直
时间能治愈一切,也能淡忘一切,所有的悲伤都会因为时间而淡忘~ |
---|