Given an integer n, generate a square matrix filled with elements from 1 to n2 in spiral order.
For example,
Given n = 3
,
[ [ 1, 2, 3 ], [ 8, 9, 4 ], [ 7, 6, 5 ] ]叫你写个螺旋矩阵。。
思路:这种题基本是控制下标。看完题目的第一想法是有点类似走迷宫,那就按这个思路来写吧。
写一个类coordinate,来表示下标,写一个方法nextLocation(Coordinate c,int dir)来返回下一个坐标,dir是方向,
通过dir的值来修改c的值,dir表示四个方向中的其中一个,
dir=1时,下一个坐标是(x-1,y)
dir=2时,下一个坐标是(x,y+1)
dir=3时,下一个坐标是(x+1,y)
dir=4时,下一个坐标是(x,y-1)
最后返回修改后的坐标。
接下来是螺旋矩阵的赋值:先初始化二维数组,默认的值为0;初始方向dir=2,表示往右走;一个坐标tmp,来存储上一个坐标
进入循环,从第一个坐标(0,0)开始,判断dir的值,拿到下一个坐标,是(0,1),判断它的值是否为0,如是则赋值,继续判断dir的值,拿到下一个坐标是(0,2),判断它的值是否为0,如是则赋值...当拿到的下标是(0,3)时,此时判断数组下标是否越界,或者值是否不为0,如果越界会报错,此时转换方向,dir的值++(dir=3),放弃当前的坐标(0,3),拿到上一个坐标tmp(0,2),继续判断dir的值,拿到下一个坐标(1,2)...以此类推,直到赋值变成n^2,结束循环
注意要点:注意输入边界值0、1。输入0对应的值是 ,输入1对应的值是1
注意不能这样写:Coordinate c = new Coordinate(0,0);
Coordinate tmp = c; 这样写会出错,当c改变时,tmp也会跟着变,因为是同一个引用
应该写成Coordinate tmp = new Coordinate(); tmp.setX(c.getX()); tmp.setY(c.getY()); 这样才可以
下面给出代码,哎,改代码只是能ac,效率有点差...等二刷的时候在想其他方法
public class Solution {
public int[][] generateMatrix(int n) {
Coordinate c = new Coordinate(0,0);
Coordinate tmp = new Coordinate();
int v=2;
int[][] a = new int[n][n];
int dir=2;
if(n == 0)
{
return a;
}
else
{
a[0][0]=1;
while(v != (n*n)+1 )
{
tmp.setX(c.getX());
tmp.setY(c.getY());
c = nextLocation(c,dir);
if( (c.getX()==0 && c.getY()==n)||
(c.getX()==n && c.getY()==n-1)||
(c.getX()==n-1 && c.getY()==-1)||
(a[c.getX()][c.getY()] != 0))
{
dir++;
c.setX(tmp.getX());
c.setY(tmp.getY());
}
if(a[c.getX()][c.getY()] == 0)
{
a[c.getX()][c.getY()] = v;
v++;
}
}
}
return a;
}
public Coordinate nextLocation(Coordinate c,int dir){
dir = dir%4;
if(dir == 0)
{
dir=4;
}
switch(dir)
{
case 1: c.setX(c.getX()-1); c.setY(c.getY());
break;
case 2: c.setY(c.getY()+1); c.setX(c.getX());
break;
case 3: c.setX(c.getX()+1); c.setY(c.getY());
break;
case 4: c.setY(c.getY()-1); c.setX(c.getX());
break;
}
return c;
}
}
class Coordinate{
public int getX() {
return x;
}
public void setX(int x) {
this.x = x;
}
public int getY() {
return y;
}
public void setY(int y) {
this.y = y;
}
private int x;
private int y;
Coordinate(){
}
Coordinate(int x,int y){
this.x=x;
this.y=y;
}
}