剑指offer:顺时针打印矩阵

剑指offer上的第20题,九度OJ上测试通过。

题目描述:

输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字,例如,如果输入如下矩阵:

1 2 3 4

5 6 7 8

9 10 11 12

13 14 15 16

则依次打印出数字1,2,3,4,8,12,16,15,14,13,9,5,6,7,11,10.

输入:

输入可能包含多个测试样例,对于每个测试案例,

输入的第一行包括两个整数m和n(1<=m,n<=1000):表示矩阵的维数为m行n列。

返回栏目页:http://www.bianceng.cnhttp://www.bianceng.cn/Programming/sjjg/

接下来的m行,每行包括n个整数,表示矩阵的元素,其中每个元素a的取值范围为(1<=a<=10000)。

输出:

对应每个测试案例,输出一行,

按照从外向里以顺时针的顺序依次打印出每一个数字,每个数字后面都有一个空格。

样例输入:

4 41 2 3 45 6 7 89 10 11 1213 14 15 16

样例输出:

1 2 3 4 8 12 16 15 14 13 9 5 6 7 11 10

这道题目没有涉及到任何算法,主要考察逻辑思维,注意各种情况的分析,循环退出的条件等。这道题目不像之前的那样,输出要特别注意最后一个输出元素的输出格式了。

AC代码如下:

#include<stdio.h>
#include<stdlib.h>  

/*
顺时针打印一圈
*/
void PrintMatrixCirclely(int **num,int m,int n,int start)
{
    int endX = n-start-1;
    int endY = m-start-1;  

    int i;
    //从左到右打印行
    for(i=start;i<=endX;i++)
        printf("%d ",num[start][i]);  

    //从上到下打印列
    if(start < endY)
    {
        for(i=start+1;i<=endY;i++)
            printf("%d ",num[i][endX]);
    }  

    //从右向左打印行
    if(start<endX && start<endY)
    {
        for(i=endX-1;i>=start;i--)
            printf("%d ",num[endY][i]);
    }  

    //从下到上打印列
    if(start<endX && start<endY-1)
    {
        for(i=endY-1;i>=start+1;i--)
        {
            printf("%d ",num[i][start]);
        }
    }
}  

/*
顺时针打印矩阵
*/
void PrintMatrixClockwisely(int **num,int m,int n)
{
    if(num==NULL || m<=0 || n<=0)
        return;
    int start = 0;
    while(m>2*start && n>2*start)
    {
        PrintMatrixCirclely(num,m,n,start);
        start++;
    }
}  

int main()
{
    int m,n;
    while(scanf("%d %d",&m,&n) != EOF)
    {
        int **num = (int **)malloc(m*sizeof(int *));
        if(num == NULL)
            exit(EXIT_FAILURE);
        int i;
        for(i=0;i<m;i++)
        {
            num[i] = (int *)malloc(n*sizeof(int));
            if(num[i] == NULL)
                exit(EXIT_FAILURE);
        }  

        int j;
        for(i=0;i<m;i++)
            for(j=0;j<n;j++)
                scanf("%d",&num[i][j]);  

        PrintMatrixClockwisely(num,m,n);
        printf("\n");  

        for(i=0;i<m;i++)
        {
            free(num[i]);
            num[i] = NULL;
        }
        free(num);
        num = NULL;
    }
    return 0;
}

吐槽下:周末一般来大学城学习,周一到周五晚上一般去图书馆学习,这些点的学习效率是最高的!鉴于实验室坑跌的考勤规定,周一到周五的上下午不得不呆在实验室学习,不得不说这个时间段的效率真的是时而好,时而坏,索性开题前把这个时间段用来写开题报告!

现在对实验室真的是一点感情都没了,满满的负能量。对这里很失望,一个磨灭人理想的地方,对这里的人也很失望,想找个志趣相投的人真的很难。

吐槽归吐槽,其实也早已习惯了,毕竟都圈在里面了一年了。毕业后大家都要为自己的未来做打算,谁还管得了谁呢?志趣相投的人会成就对方,而臭味相投的人只会毁了彼此。或许每个人的价值观不同,但现实是早晚要面对的,体谅不到父母的辛苦,就永远不会长大。

我很庆幸,在CSDN上结识了挺多有着共同追求的小伙伴,也很庆幸在这里能找到很多正能量。有些人已经拿到不错的offer,有些人还在努力,从未放弃,这些都是值得尊敬和学习的人。

任何人,只要有颗奋斗的心,并为之长久地坚持和付出,生活总并不会亏待他的。

作者:csdn博客 兰亭风雨

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索矩阵
, 测试
, oj
, 数字
, 输入
, offer比较
, offer
, 打印日期 1186 oj
, c++ offer
, offer选择
一个
,以便于您获取更多的相关知识。

时间: 2024-11-08 19:01:08

剑指offer:顺时针打印矩阵的相关文章

[剑指Offer]7.从尾到头打印链表

题目1511:从尾到头打印链表 时间限制:1 秒 内存限制:128 兆 特殊判题:否 提交:1082 解决:350 题目描述: 输入一个链表,从尾到头打印链表每个节点的值. 输入: 每个输入文件仅包含一组测试样例. 每一组测试案例包含多行,每行一个大于0的整数,代表一个链表的节点.第一行是链表第一个节点的值,依次类推.当输入到-1时代表链表输入完毕.-1本身不属于链表. 输出: 对应每个测试案例,以从尾到头的顺序输出链表每个节点的值,每个值占一行. 样例输入: 1 2 3 4 5 -1 样例输出

[剑指Offer]5.二维数组中的查找

题目 在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序.请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数. 思路 [算法系列之三十三]杨氏矩阵 代码 /*--------------------------------------- * 日期:2015-07-19 * 作者:SJF0115 * 题目: 5.二维数组中的查找 * 网址:http://www.nowcoder.com/books/coding-interviews/a

剑指offer系列之二十六:输出字符串的全排列

题目描述 输入一个字符串,按字典序打印出该字符串中字符的所有排列.例如输入字符串abc,则打印出由字符a,b,c所能排列出来的所有字符串abc,acb,bac,bca,cab和cba. 结果请按字母顺序输出. 输入描述: 输入一个字符串,长度不超过9(可能有字符重复),字符只包括大小写字母. 此题与剑指offer原题存在一些初入,在原题中并没有规定字符串中字符是否有重复的出现.不过思路是一致的,只不过是添加额外的判断罢了.下面说说我的思路吧:先不考虑是否出现重读字符,要对一个字符进行全排列,可以

[剑指Offer] 第4章课后题详解

[剑指Offer] 第4章课后题详解 目录 剑指Offer 第4章课后题详解 目录 二叉树的镜像 分析 解法 拓展 判断前序遍历 分析 解法 拓展 字符的组合 分析 解答 正方体的顶点 分析 解法 8个皇后 分析 解法 二叉树的镜像 本题为<剑指Offer>"面试题19:二叉树的镜像"一节中的"本题拓展". 请完成一个函数,输入一个二叉树,该函数输出它的镜像,要求使用循环的方法,不能用递归.二叉树节点定义如下: struct BinaryTreeNode

[剑指Offer] 第3章课后题详解

[剑指Offer] 第3章课后题详解 目录 剑指Offer 第3章课后题详解 目录 大数加法 分析 解法 优化 链表的中间节点 分析 解法 环形链表 分析 解法 反转链表 分析 解法 大数加法 本题为<剑指Offer>"面试题12:打印1到最大的n位数"一节中的"相关题目". 定义一个函数,在该函数中可以实现任意两个整数的加法. 分析 由于没有限定输入两个数的大小范围,所以需要把它当做大数问题来处理.大数无法用int,long甚至long long类型来

剑指Offer之合并两个排序的链表

题目描述: 输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则. (hint: 请务必使用链表.) 输入: 输入可能包含多个测试样例,输入以EOF结束. 对于每个测试案例,输入的第一行为两个整数n和m(0<=n<=1000, 0<=m<=1000):n代表将要输入的第一个链表的元素的个数,m代表将要输入的第二个链表的元素的个数. 下面一行包括n个数t(1<=t<=1000000):代表链表一中的元素.接下来一行包含m个元素,s(1

剑指Offer之和为S的连续正数序列

题目描述: 小明很喜欢数学,有一天他在做数学作业时,要求计算出9~16的和,他马上就写出了正确答案是100.但是他并不满足于此,他在想究竟有多少种连续的正数序列的和为100(至少包括两个数).没多久,他就得到另一组连续正数和为100的序列:18,19,20,21,22.现在把问题交给你,你能不能也很快的找出所有和为S的连续正数序列? Good Luck! 输入: 输入有多组数据. 每组数据仅包括1个整数S(S<=1,000,000).如果S为负数时,则结束输入. 输出: 对应每组数据,若不存在和

剑指offer之字符串转整数

题目描述: 将一个字符串转换成一个整数,要求不能使用字符串转换整数的库函数. 输入: 输入可能包含多个测试样例. 对于每个测试案例,输入为一个合法或者非法的字符串,代表一个整数n(1<= n<=10000000). 输出: 对应每个测试案例, 若输入为一个合法的字符串(即代表一个整数),则输出这个整数. 若输入为一个非法的字符串,则输出"My God". 样例输入:5-5+8样例输出:5-58    关于这道题目,题目本身还是不错的,真正核心的代码也就那么两行,大部分代码基

剑指offer之和为定值的两个数

题目描述: 输入一个递增排序的数组和一个数字S,在数组中查找两个数,是的他们的和正好是S,如果有多对数字的和等于S,输出两个数的乘积最小的. 输入: 每个测试案例包括两行: 第一行包含一个整数n和k,n表示数组中的元素个数,k表示两数之和.其中1 <= n <= 10^6,k为int 第二行包含n个整数,每个数组均为int类型. 输出: 对应每个测试案例,输出两个数,小的先输出.如果找不到,则输出"-1 -1" 样例输入: 6 15 1 2 4 7 11 15 样例输出: