顺时针和逆时针螺旋打印二维数组(行列式)

一.要求:

行列式,行和宽不一定相等,要求顺时针螺旋打印每一个元素,所谓顺时针螺旋即:

第一圈:从第一行第一列元素开始,先从左到右打印第一行所有元素,接着打印最后一剩余列元素,再从右到左打印最后一行剩余元素,接着从下到上打印第一列剩余元素

第二圈:从第二行第二列开始,按上面的顺时针顺序打印一圈元素

...,一圈圈反复,直到把所有元素无重复的打印完。

逆时针螺旋与上面的顺序刚好相反。

二.分析:

顺时针螺旋打印可以将问题分割为:先按顺时针打印第一圈,再按顺时针打印第二圈,其中每圈又分四个步骤:从左到右,从上到下,从右到左,从下到上。

逆时针螺旋打印可以将问题同样分割为:先按逆时针打印第一圈,再按拧时针打印第二圈,其中每圈又分四个步骤:从上到下,从左到右,从下到上,从右到左。

三.代码:

public class LuoxunArr{
    public static void main(String [] args){
        LuoxunArr larr =new LuoxunArr();
        int a[][]= {{0,1,2,3,4,5,6,7},{27,28,29,30,31,32,33,8},{26,47,48,49,50,51,34,9},{25,46,59,60,61,52,35,10},{24,45,58,63,62,53,36,11},{23,44,57,56,55,54,37,12},{22,43,42,41,40,39,38,13},{21,20,19,18,17,16,15,14}};
        //int [][]a=larr.intTwoArr(11,9);
        larr.listIntTwoArr(a);//按正常顺序打印数组
        larr.luoTwoArr(a);//按顺时针螺旋打印数组
        larr.ReluoTwoArr(a);//按逆时针螺旋打印数组
            
    }
    //用于生成随机整数
    public int  randomInt(int min,int max){
        //Math.random() [0,1)
        return (int)(Math.random()*(max+1-min)+min);
    }
    
    //用于生成二维数组,并且用随机整数给每个元素赋值
    public int[][] intTwoArr(int line,int col){
        int[][] a= new int[line][];
        for(int i=0;i<line;i++){
            a[i] =new  int[col];
        }        
        for(int i=0;i<line;i++){
            for(int j=0;j<col;j++){
                a[i][j]=randomInt(0,9);
            }
        }
        return a;
    }
    
    //用于按正常顺序打印二维数组
    public void listIntTwoArr(int [][] a){
        for(int i=0;i<a.length;i++){
            for(int j=0;j<a[i].length;j++){
                System.out.printf("%3d ",a[i][j]);
            }
            System.out.println();
        }
        System.out.println();
    }
    
    //用于顺时针螺旋打印二维数组
    public void luoTwoArr(int[][] a){
        
        int len = a.length;   //行列式的行数
        int col = a[0].length;//行列式的列数
        
        int mid=len<col?len:col;//取行和列的最小值
        
        int hang=0;//用于记录已打印的行数
        int lie=0;//用于记录已打印的列数
                
        int flag1=0;//用于记录行标或列标
        int flag2=0;//用于记录行标或列标
        
        int i=0;
        int sum=0;
        for(int start=0;start<=mid/2;start++){                    
            //1.左到右打印行
            if(hang<len){
                for(i=start;i<col-start;i++){
                    System.out.print(a[start][i] + " ");    
                    sum++;
                }    
                flag1=i-1;
                hang++;//打印的行数加1            
            }            
            
            //2.从上到下打印列
            if(lie<col){
                for(i=start+1;i<len-start;i++){
                    System.out.print(a[i][flag1] + " ");
                    sum++;                
                }
                flag2=i-1;
                lie++;    //打印的列数加1
            }    
           
            //3.从右到左打印行
            if(hang<len){
                for(i=flag1-1;i>=start;i--){
                    System.out.print(a[flag2][i] + " ");
                    sum++;
                }
                flag1=i;    
                hang++;//打印的行数加1  
            }            
            
            //4.从下到上打印列
            if(lie<col){
                for(i=flag2-1;i>start;i--){
                    System.out.print(a[i][start] + " ");
                    sum++;
                }
                lie++;    //打印的列数加1    
            }
        System.out.println("一共打印了 "+sum+" 个元素");
        }
    }
    //用于逆时针螺旋打印二维数组
    public void ReluoTwoArr(int[][] a){
        
        int len = a.length;   //行列式的行数
        int col = a[0].length;//行列式的列数
        
        int mid=len<col?len:col;//取行和列的最小值
        
        int hang=0;//用于记录已打印的行数
        int lie=0;//用于记录已打印的列数
                
        int flag1=0;//用于记录行标或列标
        int flag2=0;//用于记录行标或列标
        
        int i=0;
        int sum=0;
        for(int start=0;start<=mid/2;start++){                    
            //1.上到下打印列
            if(lie<col){
                for(i=start;i<len-start;i++){
                    System.out.print(a[i][start] + " ");    
                    sum++;
                }    
                flag1=i-1;
                lie++;//打印的行数加1            
            }    
            
            //2.从左到右打印行
            if(hang<len){
                for(i=start+1;i<col-start;i++){
                    System.out.print(a[flag1][i] + " ");
                    sum++;                
                }
                flag2=i-1;
                hang++;    //打印的列数加1

}
            
            //3.从下到上打印列
            if(lie<col){
                for(i=flag1-1;i>=start;i--){
                    System.out.print(a[i][flag2] + " ");
                    sum++;
                }
                flag1=i;    
                lie++;//打印的行数加1                
            }            
            
            //4.从右到左打印行
            if(hang<len){
                for(i=flag2-1;i>start;i--){
                    System.out.print(a[start][i] + " ");
                    sum++;
                }
                hang++;    //打印的列数加1    
            }
        System.out.println("一共打印了 "+sum+" 个元素");
        }
    }    
}

时间: 2024-10-12 14:54:53

顺时针和逆时针螺旋打印二维数组(行列式)的相关文章

螺旋打印二维数组

void main() {         // 初始的区间坐标     int startX = 0, endX = 4;     int startY = 0, endY = 5;          while(startX<=endX && startY<=endY)  // 循环条件     {         int i;         for(i=startX; i<=endX; i++)  // 输出上边的行             cout <&l

一个for循环打印二维数组

#include<stdio.h> #define MAXX 2 #define MAXY 3 void printarray() { int Arr[MAXX][MAXY] = {1,2,3,4,5,6}; for(int i = 0;i< MAXX*MAXY;i++) { printf("%d\n",Arr[i/MAXY][i%MAXY]); ///注意,一直没管MAXX什么事,在计算这一类的时候,最容易出问题 } } 一个for循环打印二维数组

转圈打印二维数组

题目要求: 思路: 我的最初思路: 将矩阵的四个边作为边界,一个循环执行四次九十度转弯,用swich.case实现,当四个边界指向一个位置结束循环,但是在拐点的处理上比较麻烦. 资料参考的思路: 写一个函数,输出二维数组一圈的元素. 循环执行上个函数,也就是输出每个圈的元素. 这个思路更好理解一些. 代码: #include<iostream> using namespace std; void printEdge(int * m, int tR, int tC, int dR, int dC

如何用一层for循环打印出一个二维数组

常规通过两层for循环可以比较轻松打印二维数组. 代码如下: #include <stdio.h> #define ROWS 3 #define COLS 3 int main() { int a[ROWS][COLS]={1,2,3,4,5,6,7,8,9}; for(int i=0;i<ROWS;i++) { for(int j=0;j<COLS;j++) printf("%d ",a[i][j]); printf("\n"); } re

Java读取excel指定sheet中的各行数据,存入二维数组,包括首行,并打印

1. 读取 //读取excel指定sheet中的各行数据,存入二维数组,包括首行 public static String[][] getSheetData(XSSFSheet sheet) throws IOException { String[][] testArray = new String[sheet.getPhysicalNumberOfRows()][]; for(int rowId =0;rowId<sheet.getPhysicalNumberOfRows();rowId++)

Java的二维数组的应用及杨辉三角的编写

(1) 编写一个程序,生成一个10*10的二维随机整数数组,并将该数组的每行最大值保存于一个一维数组中,将每列平均值保存于另外一个一维数组中并分别输出. (2) 编程输出杨辉三角的前10行. 找出一个,即该位置上的元素在该行上最大,在该列上最小(注:一个二维数组也可能没有这样的鞍点). /** * * @author liuhui *@version Java上机实验三 *@time 2016.10.30 */ public class javatest2 { public static int

《两个二维数组(矩阵)相乘》

1 //两个二维数组相乘 2 #include<stdio.h> 3 #include<stdlib.h> 4 #define M 2 5 #define N 3 6 //#define P 6 7 void main() 8 { 9 int i,j,k; 10 //二维数组A和B求乘积,积放在数组C中 11 int A[M][N],B[N][M],C[M][M]; 12 //输入二维数组A的元素的值 13 printf("请输入矩阵A的元素:"); 14 fo

C5_二维数组

// //  main.m //  C5_二维数组 // //  Created by dllo on 15/7/6. //  Copyright (c) 2015年 zhozhicheng. All rights reserved. // #import <Foundation/Foundation.h> int main(int argc, const char * argv[]) { // 二维数组 //    int arr[5]={1,2,3,4,5}; //    char stu

二维数组的认识及其表示元素的两种方式

/* ============================================================================ Name : TeatArr.c Author : lf Version : Copyright : Your copyright notice Description : 二维数组的认识以及其表示元素的两种方式 备注说明 1 要理解二维数组的存储方式. 2 实际上利用a[i][j]的方式并不"正统",这是这靠近我们的 常识一些