题目:输入一个矩阵,按照从外向里的顺序依次打印出每一个数。(画图让抽象的问题形象化)

思路:打印矩阵时,把每一层当做一个圈来打印,找到打印整个矩阵的截止条件。

从上图中我可以看到一个6*6的矩阵(长宽分别为cloums,rows)最后一圈的最左边的顶点上面的坐标为(2,2),我们同时发现在一个5*5的矩阵中最后一圈的最左边的顶点的坐标也为(2,2),并且这个顶点的坐标的横坐标和纵坐标是相同的暂且设置为(start,start),因此我们可以得到截止条件即为,cloums>startX*2,rows>startY*2.并且我们同时发现打印没一圈的时候都是同样的操作,因此,我们可以使用递归来完成该操作。

打印每一圈的情况如下图所示:

C++代码:

#include<iostream>
using namespace std;
void printMatrixInCircle(int** numbers,int cloums,int rows,int start)
{
int endx=cloums--start;
int endy=rows--start;
//从左到右打印
for(int i=start;i<=endx;i++)
{
int number=numbers[start][i];
cout<<number<<" ";
} //从上到下打印
if(start<endy)
{
for(int i=start+;i<=endy;i++)
{
int number=numbers[i][endx];
cout<<number<<" ";
}
}
//从右到左打印
if(start<endx&&start<endy)
{
for(int i=endx-;i>=start;i--)
{
int number=numbers[endx][i];
cout<<number<<" ";
}
}
//从下到上打印
if(start<endx&&start<endy-)
{
for(int i=endy-;i>=start+;i--)
{
int number=numbers[i][start];
cout<<number<<" ";
}
}
}
void printMatrixClockWisely(int** numbers,int cloums,int rows)
{
if(numbers==NULL||cloums<=||rows<=)
return;
int start=;
while(cloums>start*&&rows>start*)
{
printMatrixInCircle(numbers,cloums,rows,start);
start++;
cout<<endl;
} } void main()
{
int a[][]={{,,},{,,},{,,}};
int** b=new int*[];
for(int i=;i<;i++)
{
b[i]=a[i];
}
printMatrixClockWisely(b,,);
}

Java代码:

public class PrintMatrix {

    public static void printMatrixInCircle(int[][] numbers,int cloums,int rows,int start)
{
int endx=cloums--start;
int endy=rows--start;
//从左到右打印
for(int i=start;i<=endx;i++)
{
int number=numbers[start][i];
System.out.print(number+" ");
} //从上到下打印
if(start<endy)
{
for(int i=start+;i<=endy;i++)
{
int number=numbers[i][endx];
System.out.print(number+" ");
}
}
//从右到左打印
if(start<endx&&start<endy)
{
for(int i=endx-;i>=start;i--)
{
int number=numbers[endx][i];
System.out.print(number+" ");
}
}
//从下到上打印
if(start<endx&&start<endy-)
{
for(int i=endy-;i>=start+;i--)
{
int number=numbers[i][start];
System.out.print(number+" ");
}
}
}
public static void printMatrixClockWisely(int[][] numbers,int cloums,int rows)
{
if(numbers==null||cloums<=||rows<=)
return;
int start=;
while(cloums>start*&&rows>start*)
{
printMatrixInCircle(numbers,cloums,rows,start);
start++;
System.out.println();
} } public static void main(String[] args)
{
int a[][]={{,,},{,,},{,,}}; printMatrixClockWisely(a,,);
} }

最新文章

  1. spring访问静态资源出错,No mapping found for HTTP request with URI xxx/resources/js/jquery.min.js...
  2. 获取图片base64编码的几种方法
  3. JavaScript编码风格指南(中文版)
  4. FW: javascripts 要不要加引号
  5. Linux命令行--使用linux环境变量(转)
  6. 【转】ASP.NET Cookies简单应用 记住用户名和密码
  7. Cloud Insight支持阿里云一键接入了,so what?
  8. IDEA中添加各种依赖pom.xml文件内容
  9. 如何获取一个AlertDialog中的EditText中输入的内容
  10. Qt窗口操作函数(最大化,全屏,隐藏最大化,最小化)
  11. C++构造与析构
  12. 为什么要用深度学习来做个性化推荐 CTR 预估
  13. 【BZOJ2748】音量调节(动态规划)
  14. 在maven pom.xml中加载不同的properties ,如localhost 和 dev master等jdbc.properties 中的链接不一样
  15. 监控服务器配置(三)-----Node_exporter安装配置
  16. Android UiAutomator 快速调试
  17. 查看和修改 mysql库、表、字段编码
  18. Java 接口和抽象类区别(写的很好,转了)
  19. 在局域网内部实现远程web终端服务
  20. get the code of function in matlab

热门文章

  1. c++中指针作为函数参数的详细理解
  2. cache工作原理
  3. 通过自动回复机器人学Mybatis:代码重构(分层)
  4. JavaScript右下角信息提示插件Notyf
  5. 20145201《Java程序设计》第五次实验报告
  6. iOS项目开发优秀文章汇总
  7. oracle 中 dual 详解
  8. react native 中的ReadableMap和WritableMap的使用
  9. tomcat深入学习—权限篇
  10. PHP正则表达式 /i, /is, /s, /isU等 都是些什么东西呢?