解题思路:
前面的题解看了,有一个大佬巧妙用题目测试数据的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分
11 人评分
咖啡 2019-03-12 21:38:27 |
不应该啊
vluyk 2021-02-24 18:11:09 |
本来就不应该,不可能超限的,时间超限是因为程序陷入死循环了