逆时针打印矩阵


研究生的生活好无聊,最近想出去找找实习了。就复习一下数据结构,大一学的,也没复习过,面试的时候被鄙视了。    看到一个学姐发的,应该是金山的笔试题目:

给一个矩阵,将矩阵逆时针打印出来,如:

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

逆时针打印出来当然是:1 2 3 4 5...14 15 16

乍一看,这题目很简单,就是两个循环就可以搞定。其实,没有想的那么简单,因为每次循环后,循环体都发生了变化。参考了网上的一些解题思路,现在说一下我的思路。

1.定义一个方向d=(d+1)%4,那么d=0,1,2,3表示四个方向

2.打印矩阵当前的行col:k->j,列为row:m->n,初始条件:col=0,row=0,k=0,j=3,m=0,n=3

3,当打印第一列后,k+=1,col=n

4,当打印最后一行后,n-=1,row=j

5,打印最后一列,j-=1,col=m

6,打印第一行,m+=1,row=k

...

7.终止条件:m==n&&k==j

下面贴出我用java写的代码:

int [][]p={{1,12,11,10,},{2,13,16,9},{3,14,15,8},{4,5,6,7}};
        int col=0,row=0;//当前的列和行
        int m=0,n=3,k=0,j=3;//col:m->n  row:k->j
        int d=-1;//表示方向
        while(true)
        {
        	d=(d+1)%4;
	        switch (d)
			{
			case 0:
				for(int i=m;i<=n;i++ )
				{
					System.out.print(p[i][row]+" ");
				}
				col=n;
				k+=1;//防止重复

				break;
			case 1:
				for(int i=k;i<=j;i++)
				{
					System.out.print(p[col][i]+" ");
				}
				row=j;
				n-=1;//防止重复

				break;
			case 2:
				for(int i=n;i>=m;i--)
				{
					System.out.print(p[i][row]+" ");
				}
					col=m;
					j-=1;

				break;
			case 3:
				for(int i=j;i>=k;i--)
				{
					System.out.print(p[col][i]+" ");
				}
			    row=k;
				m+=1;

				break;
			default:
				break;
			}
	        if(m==n&&k==j)
	        {
	        	break;
	        }
        }
时间: 2024-08-30 08:17:44

逆时针打印矩阵的相关文章

输入一个维度,逆时针打印出一个指定的矩阵

题目:用户给定一个维度,打印出指定的一个矩阵,例如用户给定10,输出应该如下图所示: 程序如下: #include <stdio.h> #include <malloc.h> int main() { int dimension; int *p; int startx, starty, endx, endy; int i, j, value = 0; printf("Please input dimension:"); scanf("%d",

笔试算法题(26):顺时针打印矩阵 &amp; 求数组中数对差的最大值

出题: 输入一个数字矩阵,要求从外向里顺时针打印每一个数字: 分析: 从外向里打印矩阵有多重方法实现,但最重要的是构建合适的状态机,这样才能控制多重不同的操作: 注意有四种打印模式(左右,上下,右左,下上),所以需要一个index变量控制每次循环时执行的打印模式: 注意水平打印和垂直打印分别需要两个变量控制打印元素,并且两组变量中的两个端点都是相互靠近的(hs和he,vs和he),每执行一种打印模式之前,需要更新当前打印模式中打印方向的其实坐标,因为它已经在上一种打印模式中打印过: 每一种打印模

顺时针打印矩阵(经典算法)

输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字,例如,如果输入如下矩阵: 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. #该函数像魔方一样翻转矩阵,每次都把要打印的一列翻转到第一行def turnMatrix(matrix): r = len(matrix) c = len(matrix[0]) B = [] for i in range(c-1,-1,-

顺时针打印矩阵

P128顺时针打印矩阵 题目:输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字.例如:如果输入如下矩阵: 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 #define _CRT_SECURE_NO_WARNINGS 1 #include<stdio.h>   #include<stdlib.h>   void printMatri

顺时针打印矩阵-剑指Offer

顺时针打印矩阵 题目描述 输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字,例如,如果输入如下矩阵: 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. 思路 整体是按着一圈一圈打印,需要找到循环继续的条件:columns > startX * 2并且rows > startY * 2 注意打印每圈的时候,四个边的打印循环起始条件 代码 import java.

剑指OFFER之顺时针打印矩阵(九度OJ1391)

题目描述: 输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字,例如,如果输入如下矩阵: 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列. 接下来的m行,每行包括n个整数,表示矩阵的元素,其中每个元素a的取值范围为(1&l

顺时针打印矩阵——20

输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字.例如,输入如下矩阵: 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. 其实顺时针的打印,无非就是先打印出矩阵最外面的第一行,然后是最后一列,然后是最后一行,最后是第一列,每一次打印时控制的条件也就是矩阵的行和列的边界,那么打印完一圈之后只需要改变打印的范围也就是首尾行和首尾列就可以再打印

剑指offer之【顺时针打印矩阵】

题目: 顺时针打印矩阵 链接: https://www.nowcoder.com/practice/9b4c81a02cd34f76be2659fa0d54342a?tpId=13&tqId=11172&rp=1&ru=/ta/coding-interviews&qru=/ta/coding-interviews/question-ranking 题目描述: 输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字,例如,如果输入如下矩阵: 1 2 3 4 5 6 7

1-2-顺时针打印矩阵

1 /* 2 题目描述: 3 对于一个矩阵,请设计一个算法从左上角(mat[0][0])开始,顺时针打印矩阵元素. 4 给定int矩阵mat,以及它的维数nxm,请返回一个数组,数组中的元素为矩阵元素的顺时针输出. 5 测试样例: 6 [[1,2],[3,4]],2,2 7 返回:[1,2,3,4] 8 */ 9 /* 10 还是要注意细节,坐标在变换的时候,应该如何增减. 11 */ 12 #include <iostream> 13 #include <vector> 14 u