题目思路
1、通过模拟样例可以发现走格子的方向规律:右 左下 下 右上
2、设置方向数组 //右 左下 下 右上
int[] dx= {0,1,1,-1};
int[] dy= {1,-1,0,1};
3、在能走的情况下,右 下只走一步 左下 右上 可以一直走
4、一个方向走完,需要改变方向再走
样例
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;
public class Main
{
private static int N=510;
private static boolean[][] st=new boolean[N][N];
private static int[][] a=new int[N][N];
private static int n;
private static List<Node> list=new ArrayList<>();
public static void main(String[] args)
{
Scanner scan=new Scanner(System.in);
n=scan.nextInt();
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
a[i][j]=scan.nextInt();
function();
for(int i=0;i<list.size();i++)
{
int x=list.get(i).x;
int y=list.get(i).y;
System.out.print(a[x][y]+" ");;
}
scan.close();
}
private static void function()
{
list.add(new Node(1,1));
st[1][1]=true;
//右 左下 下 右上
int[] dx= {0,1,1,-1};
int[] dy= {1,-1,0,1};
int p=0;//开始向右走
int x=1,y=1;//从1 1出发
while(true)
{
if(list.size()==n*n)
break;
while(true)
{
//右
if(p==0)
{
x+=dx[p];
y+=dy[p];
if(x>=1&&x<=n&&y>=1&&y<=n&&!st[x][y])
{
list.add(new Node(x,y));
st[x][y]=true;
}
else
{
x-=dx[p];
y-=dy[p];
}
break;
}
//左下
else if(p==1)
{
while(x+dx[p]>=1&&x+dx[p]<=n&&y+dy[p]>=1&&y+dy[p]<=n&&!st[x+dx[p]][y+dy[p]])
{
x+=dx[p];
y+=dy[p];
st[x][y]=true;
list.add(new Node(x,y));
}
break;
}
//下
else if(p==2)
{
x+=dx[p];
y+=dy[p];
if(x>=1&&x<=n&&y>=1&&y<=n&&!st[x][y])
{
list.add(new Node(x,y));
st[x][y]=true;
}
else
{
x-=dx[p];
y-=dy[p];
}
break;
}
//右上
else if(p==3)
{
while(x+dx[p]>=1&&x+dx[p]<=n&&y+dy[p]>=1&&y+dy[p]<=n&&!st[x+dx[p]][y+dy[p]])
{
x+=dx[p];
y+=dy[p];
st[x][y]=true;
list.add(new Node(x,y));
}
break;
}
}
//改变方向
p=(p+1)%4;
}
}
private static class Node
{
private int x;
private int y;
public Node(int x,int y)
{
this.x=x;
this.y=y;
}
}
}