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 个字符,否则网格会错位
相关推荐
怎么比啊都是大神几秒前
关于==null、isEmpty()和StrUtil.isBlank()
java
唐青枫3 分钟前
Java Neo4j 实战指南:从图模型、Cypher 到 Spring Boot 关系查询
java
Reart6 分钟前
Leetcode 123.买卖股票的最佳时期3(内有随心谈,718)
后端·算法
观远数据9 分钟前
从离线开发到实时同步:DataFlow如何支撑企业级数据治理闭环
java·windows·microsoft·excel
小林ixn30 分钟前
Python基础全梳理:从注释到函数,这些细节你都掌握了吗?
python·编程语言
可编程芯片开发31 分钟前
基于RMDCFT算法的天基雷达空间机动目标检测方法MATLAB仿真,对比FRFT和DFT算法
算法
noipp1 小时前
推荐题目:洛谷 B2099 矩阵交换行
线性代数·算法·矩阵
今天AI了吗1 小时前
Hermes Agent 搭建全流程:从本机试跑到可持续运行的个人 AI Agent
java·人工智能·python·学习·embedding
春卷同学1 小时前
032-关系型数据库在记账应用中的建模与查询优化
java·jvm·数据库
不平衡的叉叉树2 小时前
Springboot+Mockito简单使用单元测试
java·spring boot·单元测试