L1-054 福到了(15 分)[java][python]

题目描述

"福"字倒着贴,寓意"福到"。不论到底算不算民俗,本题请你编写程序,把各种汉字倒过来输出。这里要处理的每个汉字是由一个 N × N 的网格组成的,网格中的元素或者为字符 @ 或者为空格。而倒过来的汉字所用的字符由裁判指定。


输入输出格式

项目 说明
输入格式 第一行:指定字符 + 空格 + N(≤100 的正整数);随后 N 行,每行 N 个字符(@ 或空格)
输出格式 倒置的网格;若字正过来倒过去相同,先输出 bu yong dao le 再输出网格

样例

输入样例 1:

复制代码
$ 9
@ @@@@@
@@@ @@@
@ @ @
@@@ @@@
@@@ @@@@@
@@@ @ @ @
@@@ @@@@@
@ @ @ @
@ @@@@@

输出样例 1:

复制代码
$$$$$ $
$ $ $ $
$$$$$ $$$
$ $ $ $$$
$$$$$ $$$
$$$ $$$
$ $ $
$$$ $$$
$$$$$ $

输入样例 2:

复制代码
& 3
@@@
@ @
@@@

输出样例 2:

复制代码
bu yong dao le
&&&
& &
&&&

解题思路

核心操作:网格倒置(旋转 180°)

倒置即坐标变换:(i, j) → (n-1-i, n-1-j)

算法步骤:

  1. 读取输入 :读取指定字符 c 和网格大小 n,再读取 n 行字符串
  2. 判断对称 :遍历网格,检查每个位置 a[i][j]a[n-1-i][n-1-j] 是否相同。如果全部相同,说明字倒过来和原来一样
  3. 输出结果
    • 如果对称:先输出 bu yong dao le
    • 无论如何都输出倒置后的网格(将 @ 替换为指定字符,空格保持不变)

关键点:

  • 读取网格时每行末尾的空格需要保留,可以用 list(line).append(' ') 补齐到 n 个
  • 对称判断:只需遍历左上三角即可(因为 (i,j)(n-1-i,n-1-j) 配对)
  • 字符替换:倒置网格中 a[n-1-i][n-1-j]@ 时输出指定字符

代码实现

Java 代码

java 复制代码
import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        String repStr = scanner.next();
        char replaceChar = repStr.charAt(0);
        int n = scanner.nextInt();
        scanner.nextLine();

        char[][] a = new char[n][n];
        for (int i = 0; i < n; i++) {
            String line = scanner.nextLine();
            // 补齐空格使每行达到 n 个字符
            while (line.length() < n) {
                line += " ";
            }
            for (int j = 0; j < n; j++) {
                a[i][j] = line.charAt(j);
            }
        }

        // 判断是否对称(倒过来和原来相同)
        boolean symmetric = true;
        for (int i = 0; i < n && symmetric; i++) {
            for (int j = 0; j < n; j++) {
                if (a[i][j] != a[n - 1 - i][n - 1 - j]) {
                    symmetric = false;
                    break;
                }
            }
        }

        if (symmetric) {
            System.out.println("bu yong dao le");
        }

        // 输出倒置后的网格
        for (int i = 0; i < n; i++) {
            StringBuilder sb = new StringBuilder();
            for (int j = 0; j < n; j++) {
                char ch = a[n - 1 - i][n - 1 - j];
                sb.append(ch == '@' ? replaceChar : ' ');
            }
            System.out.println(sb.toString());
        }

        scanner.close();
    }
}

Python 代码

python 复制代码
def main():
    rep, n = input().split()
    n = int(n)
    a = []
    for _ in range(n):
        line = input()
        # 补齐空格到 n 个字符
        line = list(line.ljust(n))
        a.append(line)

    # 判断是否对称
    symmetric = all(a[i][j] == a[n - 1 - i][n - 1 - j] for i in range(n) for j in range(n))

    if symmetric:
        print("bu yong dao le")

    # 输出倒置网格
    for i in range(n):
        row = ""
        for j in range(n):
            ch = a[n - 1 - i][n - 1 - j]
            row += rep if ch == '@' else ' '
        print(row)

if __name__ == "__main__":
    main()

运行验证

样例 1 验证

输入:

复制代码
$ 9
@ @@@@@
@@@ @@@
@ @ @
@@@ @@@
@@@ @@@@@
@@@ @ @ @
@@@ @@@@@
@ @ @ @
@ @@@@@

Python 输出:

复制代码
$$$$$ $
$ $ $ $
$$$$$ $$$
$ $ $ $$$
$$$$$ $$$
$$$ $$$
$ $ $
$$$ $$$
$$$$$ $

样例 2 验证

输入:

复制代码
& 3
@@@
@ @
@@@

Python 输出:

复制代码
bu yong dao le
&&&
& &
&&&

复杂度分析

  • 时间复杂度:O(N²),遍历两次 N×N 网格(对称判断 + 输出)
  • 空间复杂度:O(N²),存储整个网格

总结

本题考察二维数组的读取、坐标变换和字符串处理。核心在于:

  1. 倒置坐标映射(i, j) → (n-1-i, n-1-j),即中心对称翻转
  2. 对称判断 :只需检查 a[i][j] == a[n-1-i][n-1-j],利用配对关系减少比较次数
  3. 空格处理:读取时需要补齐空格到 n 个字符,否则网格会错位
相关推荐
王老师青少年编程1 小时前
csp信奥赛C++高频考点专项训练之贪心算法 --【区间贪心】:线段覆盖
c++·算法·贪心·csp·信奥赛·区间贪心·线段覆盖
痴男本疒2 小时前
从一道算法题发现的泛型问题
算法
Flittly2 小时前
【SpringSecurity新手村系列】(7)基于资源权限码(Authority)的接口权限控制实战
java·spring boot·安全
斯维赤2 小时前
Python学习超简单第十一弹:邮件发送
开发语言·python·学习
qq_372154232 小时前
如何配置表中某列的排序权重_全文索引配置与权重分配
jvm·数据库·python
M--Y2 小时前
Redis集群和典型应用场景
redis·算法·哈希算法·集群
还是阿落呀2 小时前
如何判断一个年份是否为闰年?
python
2501_914245932 小时前
CSS如何使用-nth-of-type精确选择列表项_通过元素类型限制提升样式健壮性
jvm·数据库·python
MediaTea2 小时前
AI 术语通俗词典:召回率(分类)
人工智能·算法·机器学习·分类·数据挖掘