解题思路:

前面的题解看了,有一个大佬巧妙用题目测试数据的bug(测试数据中没有-1,或许没有负数);这里我来介绍一种适合任何测试数据的解法(数据范围和题目相同,但是测试数据能兼容每一个整数):


首先定义两个数组:a[maxn][maxn]、flag[maxn][maxn];a用来保存每一个输入的数据,flag用来记录a数组中对应位置上数是否被用过。


这里我用到了预判断,也就是在处理下一个数之前,先判断下一个位置上是否有数且没有被访问过和没有越界;如果满足这三个条件即访问这个数并打印;并把这个数对应位置上标记数组的值取反。


其实说的这里,应该大家都明白我的意思了吧;


在说一点;题目中说最后不要多余的空格,但是测试并没有测试这个点,当然我程序中实现了这个一点,大家注意观察。

注意事项:


while不能换成if……else if ……else if  , 有的人或许看了我的思路不看代码(很鼓励这样做),有人会知道这个为什么,当然也有不知道的,这里我不细说,大家用一个3 * 4矩阵打打断点调试就会明白的。


理解我所写的这个题解的简洁,题不难,思路给了大家,自己好好实现一下,调试调试收益比看详细题解要大。    谢谢  ……

参考代码:

#include <cstdio>
#include <cstdlib>
#include <iostream>
#include <cmath>
#include <cctype>
#include <cstring>
#include <string>
#include <stack> 
#include <algorithm>
#include <functional>
using namespace std;
const int maxn = 201;
int a[maxn][maxn], flag[maxn][maxn];
int main()
{
	int m, n, tot = 1, x, y;
	scanf("%d%d", &m, &n);
	for(int i = 0; i < m; ++i)
	for(int j = 0; j < n; ++j)
	{
		scanf("%d", &a[i][j]);
	}
	printf("%d", a[x=0][y=0]);
	flag[0][0] = 1;
	while(tot < m*n)
	{
		while(x+1<m && !flag[x+1][y])
		{
			printf(" %d", a[++x][y]);
			tot++;
			flag[x][y] = 1;
		}
		while(y+1<n && !flag[x][y+1])
		{
			printf(" %d", a[x][++y]);
			tot++;
			flag[x][y] = 1;
		}
		while(x-1>=0 && !flag[x-1][y])
		{
			printf(" %d", a[--x][y]);
			tot++;
			flag[x][y] = 1;
		}
		while(y-1>=0 && !flag[x][y-1])
		{
			printf(" %d", a[x][--y]);
			tot++;
			flag[x][y] = 1;
		}
	}
	printf("\n");  
    return 0; 
}

点赞(25)
 

0.0分

7 人评分

C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:

一点编程也不会写的:零基础C语言学练课程

解决困扰你多年的C语言疑难杂症特性的C语言进阶课程

从零到写出一个爬虫的Python编程课程

只会语法写不出代码?手把手带你写100个编程真题的编程百练课程

信息学奥赛或C++选手的 必学C++课程

蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程

手把手讲解近五年真题的蓝桥杯辅导课程

评论列表 共有 3 条评论

vluyk 3年前 回复TA
@Aegon 本来就不应该,不可能超限的,时间超限是因为程序陷入死循环了
咖啡 5年前 回复TA
@Aegon 不应该啊
Aegon 5年前 回复TA
我用c++按照这个方法写,好像还是时间超限了啊