package 顺时针打印矩阵;
/*
* 题目:输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字。
* 例如:如果输入如下矩阵:
* 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。
*/
public class ClockWiseDemo {
private static int[][] array = {
{ 1, 2, 3, 4 },
{ 5, 6, 7, 8 },
{ 9, 10, 11, 12},
{ 13, 14, 15, 16},
{ 17, 18, 19, 20}
};
enum DIRECTION {
L, R, T, D
}; // 当前方向,分别代表左右上下
private static DIRECTION direct = DIRECTION.R; // 初始方向为向右
/*
* rows是矩阵的行数 cols是矩阵的列数
*/
public static void printClockWise(int[][] array, int rows, int cols) {
if (array == null || rows < 0 || cols < 0) {
System.out.println("无效输入!");
return;
}
if (rows == 0) { // 行数为0
System.out.println("无效输入!");
return;
}
if (rows > 0 && cols == 0) { // 列数为0
System.out.println("无效输入!");
return;
}
if (rows == 1 && cols > 1) { // 一行多列
// System.out.println("One row, multi cols");
for (int i = 0; i < cols; i++) {
System.out.print(array[0][i] + "\t");
}
return;
}
if (rows > 1 && cols == 1) {// 一列多行
// System.out.println("One col, multi rows");
for (int j = 0; j < rows; j++) {
System.out.print(array[j][0] + "\t");
}
return;
}
// 一般情况
int w = cols, h = rows; //w为水平方向需要遍历的元素个数,比如w=4表示在水平方向遍历了4个元素后就要改变方向;h同
int startX = 0, startY = 0; //从第一个元素开始
while(true) {
switch(direct) {
case R: { //当前向右,向右到顶后是向下
for(int j=0;j<w;j++) {//向右是水平遍历的一种,所以用w
System.out.print(array[startX][startY++] + "\t");
}
//重置h,因为向右接下来是向下(顺时针嘛),水平遍历一行则等效于矩阵行数少1所以h减去1
h--;
//重置(startX,startY)为下次的起点,在这之前检查是否所有元素都已经遍历完了
if(h==0) { //h为0表示所有元素都已经遍历完了
return;
}
startX++;
startY--;
direct = DIRECTION.D;
break;
}
case D: { //当前向下,向下到顶后是向左
for(int i=0;i<h;i++) {
System.out.print(array[startX++][startY] + "\t");
}
//重置w,因为向下接下来是向左,垂直遍历一行等效于矩阵列数少1,所以w减去1
w--;
//重置(startX,startY)为下次的起点,在这之前检查是否所有元素都已经遍历完了
if(w==0) { //w为0表示所有元素都已经遍历完了
return;
}
startX--;
startY--; //因为接下来是向左
direct = DIRECTION.L;
break;
}
case L: { //当前向左,向左到顶后是向上
for(int j=0;j<w;j++) {
System.out.print(array[startX][startY--] + "\t");
}
//重置h,因为接下来是向上,水平遍历一行等效于矩阵行数少1,所以h减去1
h--;
//重置(startX,startY)为下次的起点,在这之前检查是否所有元素都已经遍历完了
if(h==0) {
return;
}
startX--;
startY++;
direct = DIRECTION.T;
break;
}
case T: { //当前向上,向上到顶后是向右
for(int i=0;i<h;i++) {
System.out.print(array[startX--][startY] + "\t");
}
//重置w,因为接下来是向右,垂直遍历一列等效于矩阵列数少1,所以h减去1
w--;
//重置(startX,startY)为下次的起点,在这之前检查是否所有元素都已经遍历完了
if(w==0) {
return;
}
startX++;
startY++;
direct = DIRECTION.R;
break;
}
}
}
}
public static void main(String[] args) {
printClockWise(array, 5, 4);
}
}
矩阵顺时针打印实现——原创
4星 · 超过85%的资源 需积分: 29 83 浏览量
2011-05-12
23:49:07
上传
评论
收藏 1KB RAR 举报
feichexia
- 粉丝: 92
- 资源: 19
最新资源
- 基于UC3842+LTS26Q1565A设计PC机充电器 硬件(原理图+PCB)工程文件.zip
- Hive SQL经典面试题,大数据SQL经典面试题
- Qt实现喷码器代码,实现二维码、条形码、图形的旋转、移动等
- 基于LM324芯片比较器传感器模块AD09设计硬件(原理图+PCB)工程文件.zip
- HTTP请求 - 记一笔-添加记账.jmx
- 2205040245凡永超硬间隔svm.ipynb
- Qt喷码器demo,演示软件,不是代码
- 目标跟踪-基于目标中心点同时进行目标检测+目标跟踪算法实现-项目源码-优质项目实战.zip
- Python《文本特征分析-全唐诗数据挖掘及分析 》+源代码
- Netron-Setup-4.5.0
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈