咖啡


私信TA

用户名:Tianxn

访问量:22075

签 名:

人一我百,人十我万

等  级
排  名 14
经  验 9364
参赛次数 1
文章发表 138
年  龄 22
在职情况
学  校 西安航空学院
专  业 软件工程

  自我简介:

解题思路:

前面的题解看了,有一个大佬巧妙用题目测试数据的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分

0 人评分

C语言网提供「C语言、C++、算法竞赛」在线课程,全部由资深研发工程师或ACM金牌大佬亲授课,更科学、全面的课程体系,以在线视频+在线评测的学习模式学习,学练同步,拒绝理论派,真正学会编程!还有奖学金等增值福利等你!

  评论区

我用c++按照这个方法写,好像还是时间超限了啊
2019-03-12 11:05:37 | |
  • «
  • 1
  • »