蓝桥杯-回形取数(数据较大会超时)

本文介绍了一种沿矩阵边界按特定顺序获取数值的算法——回形取数,并提供了Java实现代码。该算法从矩阵左上角开始,按指定路径遍历整个矩阵,确保每个元素仅被访问一次。
package jiChu;

import java.util.Scanner;

/**
 问题描述
  回形取数就是沿矩阵的边取数,若当前方向上无数可取或已经取过,则左转90度。一开始位于矩阵左上角,方向向下。
输入格式
  输入第一行是两个不超过200的正整数m, n,表示矩阵的行和列。接下来m行每行n个整数,表示这个矩阵。
输出格式
  输出只有一行,共mn个数,为输入矩阵回形取数得到的结果。数之间用一个空格分隔,行末不要有多余的空格。
样例输入
3 3
1 2 3
4 5 6
7 8 9
样例输出
1 4 7 8 9 6 3 2 5
样例输入
3 2
1 2
3 4
5 6
样例输出
1 3 5 6 4 2

 * @author Vivinia
 *
 * 2018年1月21日
 */
public class TTTTTTTT {
static boolean[][] vis;
static int m,n,i,j,flag=0,cy=0;  //cy循环圈数,flag打印数据个数
static int[][] num;
	public static void main(String[] args) {
		Scanner input=new Scanner(System.in);
		m=input.nextInt();
		n=input.nextInt();
		num=new int[m][n];
		vis=new boolean[m][n];
		for(i=0;i<m;i++) 
			for(j=0;j<n;j++)
				num[i][j]=input.nextInt();
		input.close();
		i=j=0;
		while(flag!=m*n) {
			cy++;
			j=cy-1;
			for(i=cy-1;i<=m-cy;i++)          //左边从上到下
				print(i,j);
			i--;
			for(j=cy-1;j<n-cy;j++)         //下边从左到右
				print(i,j);
			for(i=m-cy;i>cy-1;i--)        //右边从下到上
				print(i,j);
			for(j=n-cy;j>cy-1;j--)      //上边从右到左
				print(i,j);
		}
	}
	static void print(int x,int y){
		if(!vis[i][j]) {
			vis[i][j]=true;
			flag++;
			System.out.print(num[i][j]+" ");
		}
	}
}


十个测试数据总会有一两个比较大的过不了,看了下网上的代码,也都是用了两层循环的,思路基本类似,实在不知道该怎样优化,先这样记录下吧,等有空再研究(基本不可能)。。。

1.注意四个边和循环次数的关系,每圈到边界的距离是圈数-1(圈数从1开始计算),所以可以转换为下标范围;

2.注意没圈左上角的数据,因为是介于两圈之间,所以下标需要仔细考虑;


<think>嗯,用户之前问了关于sys.stdin.read()在算法中的使用时机,现在又问了蓝桥杯比赛中多大的数据量需要用这个方法或者其他输入方式。我需要先理解用户的需求。他可能在准备蓝桥杯比赛,想知道在不同数据规模下如何选择合适的输入方法,以优化程序效率,避免超时。 首先,蓝桥杯数据量不同题目差异可能很大。用户可能想知道在什么样的数据量下应该使用更高效的输入方式,比如sys.stdin.read()而不是普通的input()。需要回忆蓝桥杯常见的题目数据范围,比如不同的数据量级对应的输入方法选择。 比如,当数据量是1e4或更高时,逐行读取可能不够快,这时候用sys.stdin.read()一次性读取会更高效。而如果数据量较小,比如1e3,可能input()就足够了,不会影响性能。需要分情况讨论,给出具体的分界点和示例。 另外,用户可能希望知道在不同编程语言中的情况,但之前的问题是关于Python的,所以可能需要专注于Python的情况。同时,可能需要注意蓝桥杯比赛中Python的时间限制,因为Python本身运行较慢,输入输出优化更关键。 需要给出一个清晰的层次结构,比如小数据量、中等、大数据量时应该用什么方法,以及具体的例子,比如数据量在1e5以上时推荐使用sys.stdin.read()。同时要提醒用户注意内存问题,当数据量极大时,比如接近1e6或更高,一次性读取可能会占用太多内存,这时候可能需要折中的方法,比如分批读取或者使用生成器。 可能还需要补充一些测试用例的例子,或者不同输入方法在时间上的差异,比如input()和sys.stdin.read()在处理1e5数据时的时间对比,让用户更直观地理解为什么要选择不同的方法。 另外,用户可能想知道除了输入方法的选择,还有哪些优化技巧,比如使用split()后的处理,或者类型转换的优化,但可能这个问题的焦点是在数据量大小和输入方法的选择,所以需要围绕这点展开。 最后,总结一下,分不同数据规模给出建议,并提醒注意事项,比如内存、输入格式的复杂性等。可能还需要提到蓝桥杯常见的题型和它们的数据规模,帮助用户更好地判断。</think>在蓝桥杯等算法竞赛中,**数据规模直接影响输入方法的选择和代码效率优化策略**。以下是不同数据规模的常见应对方法及建议: --- ### **1. 小规模数据(n ≤ 1e3)** - **典型场景**:简单模拟题、数学题(如求质数、排列组合等)。 - **输入方法**: 使用 `input()` 或 `sys.stdin.readline()` 逐行读取即可,代码简单易写。 - **示例**: ```python n = int(input()) data = [input().strip() for _ in range(n)] # 逐行读取 ``` --- ### **2. 中等规模数据(n ≤ 1e5)** - **典型场景**:动态规划、贪心、图论(稀疏图)等。 - **输入方法**: 优先使用 `sys.stdin.readline()` 逐行读取,或 `sys.stdin.read()` 一次性读取后分割。 **Python 的 `input()` 在高频调用时较慢,需避免**。 - **示例**: ```python import sys data = list(map(int, sys.stdin.read().split())) # 一次性读取并转换 ``` --- ### **3. 大规模数据(n ≥ 1e6)** - **典型场景**:复杂图论(稠密图)、大规模数组操作、需要 O(n) 算法的题目。 - **输入方法**: 必须用 `sys.stdin.read()` 一次性读取所有输入,分割后处理。 **逐行读取(如 `input()`)可能因调用次数过多导致超时**。 - **示例**: ```python import sys data = sys.stdin.read().split() # 避免多次IO numbers = list(map(int, data)) ``` --- ### **4. 超大规模数据(n ≥ 1e7 或内存敏感)** - **典型场景**:内存限制严格或数据量接近内存上限的题目(如 1e7 个整数需约 40MB 内存)。 - **优化策略**: - **流式处理**:分批读取(如 `sys.stdin.read(4096)`),避免一次性加载全部数据- **生成器**:逐行生成数据,减少内存占用。 - **示例**: ```python import sys while chunk := sys.stdin.read(4096): # 分批读取 process(chunk) # 逐步处理 ``` --- ### **关键注意事项** 1. **时间限制**: - Python 在蓝桥杯中通常有 1~5 秒的时间限制,输入效率直接影响是否超时- **经验法则**:当输入数据量 ≥1e5 时,优先使用 `sys.stdin.read()`。 2. **输入格式复杂度**: - 若输入包含混合类型(如交替的数字和字符串),可一次性读取后按索引解析。 3. **内存限制**: - 蓝桥杯 Python 内存限制通常为 256MB~1GB。 - **估算内存**:1e6 个整数约占用 4MB(int 类型),1e7 约 40MB。 --- ### **不同方法的性能对比(Python)** | 方法 | 1e4 数据耗时 | 1e5 数据耗时 | 适用场景 | |--------------------------|--------------|--------------|-----------------------| | `input()` | ~0.1s | ~1s | 小数据、简单题 | | `sys.stdin.readline()` | ~0.05s | ~0.5s | 中等数据、需逐行处理 | | `sys.stdin.read()` | ~0.01s | ~0.1s | 大数据、需整体解析 | --- ### **实战建议** - **默认策略**:蓝桥杯中若数据规模不明确,优先使用 `sys.stdin.read()`,避免输入成为瓶颈。 - **调试技巧**:本地测试时用文件重定向模拟输入(如 `python code.py < input.txt`)。 - **Python 优化**:对数值类数据,优先用 `map(int, data)` 而非列表推导式。 --- 掌握数据规模与输入方法的匹配,能在竞赛中节省大量时间,避免因输入输出问题遗憾丢分!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值