您的位置:首页 > 其它

每日一练-----顺时针打印矩阵

2016-05-01 22:11 190 查看
思想:

我们可以将矩阵分成一圈一圈的进行打印,而确定这个圈的大小可以通过左上角坐标和右下角坐标来实现,打印完一圈之后令左上角横纵坐标均加1,右下角横纵坐标均减1,如果当左上角横坐标等于右下角横坐标的话,那么根本不用四个循环来输出一圈了,直接输出这行就可以了,如果左上角纵坐标和右下角纵坐标相等的话,同样也不需要利用四个for循环打印一圈,只需要打印这一列就可以了,除此之外就需要四个for循环来打印一圈了,直到右下角的横坐标或者纵坐标大于左上角的横坐标或者纵坐标为止;

代码如下:

<span style="font-size:18px;">import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;

public class ClockwisePrint {
public static List<Integer> list = new ArrayList<>();
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
int n = in.nextInt();
int m = in.nextInt();
int[][] mat = new int
[m];
for(int i = 0;i < n;i++)
{
for(int j = 0;j < m;j++)
{
mat[i][j] = in.nextInt();
}
}
clockwisePrint(mat, n, m);
print(list);
}
public static void clockwisePrint(int[][] mat,int n,int m)
{
int startX = 0;
int startY = 0;
int endX = n-1;
int endY = m-1;
while(startX <= endX && startY <= endY)
{
getList(mat, startX, startY, endX, endY);
startX = startX+1;
startY = startY+1;
endX = endX-1;
endY = endY-1;
}
}
/**
* 只打印一环
* @param mat
* @param startX
* @param startY
* @param endX
* @param endY
* (startX,startY)开始打印坐标,(endX,endY)结束打印坐标
*/
public static void getList(int[][] mat,int startX,int startY,int endX,int endY)
{
int i;
//表示开始和结束的在同一行,直接输出这两个坐标之间的值即可
if(startX == endX)
{
for(i = startY;i <= endY;i++)
list.add(mat[startX][i]);
return;//直接返回
}
//表示开始和结束在同一列,直接输出这两个坐标之间的值即可
if(startY == endY)
{
for(i = startX;i <= endX;i++)
list.add(mat[i][startY]);
return;//直接返回
}
for(i = startY;i <= endY;i++)
{
//存储一行
list.add(mat[startX][i]);
}
for(i = startX+1;i <= endX;i++)
{
//存储一列
list.add(mat[i][endY]);
}
for(i = endY-1;i >= startY;i--)
{
//存储一行
list.add(mat[endX][i]);
}
for(i = endX-1;i >= startX+1;i--)
{
//存储一列
list.add(mat[i][startY]);
}
}
public static void print(List<Integer> list)
{
for(int i = 0;i < list.size();i++)
System.out.print(list.get(i)+" ");
}</span>
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: