解题思路:
前面的题解看了,有一个大佬巧妙用题目测试数据的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; }
0.0分
7 人评分
C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:
一点编程也不会写的:零基础C语言学练课程
解决困扰你多年的C语言疑难杂症特性的C语言进阶课程
从零到写出一个爬虫的Python编程课程
只会语法写不出代码?手把手带你写100个编程真题的编程百练课程
信息学奥赛或C++选手的 必学C++课程
蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程
手把手讲解近五年真题的蓝桥杯辅导课程
发表评论 取消回复