问题描述
问题链接:https://www.acwing.com/problem/content/758/
分析
- 如果要输入的话需要考虑当前数字的四个方向:上下左右。我们可以用两个一维数组dx和dy将当前数字上下左右的位置相对于当前数字的偏移量保存下来。
- 并用0,1,2,3分别表示上右下左四个方向(顺时针),用变量d来保存
- 用(x,y)表示当前位置,(a,b)表示下一步要走的位置,我们需要判断是否需要改变方向,这里又分两种情况:出界和之前已经走过该位置如果需要改变方向的话我们需要更新d的值:d=(d+1)%4,然后将新的a和b的值赋值给x和y(a=x+dx[d],b=y+dy[d])
结合图来理解一下
- dx相对原始位置上右下左x方向的偏移量
- dy相对原始位置上右下左y方向的偏移量
- d相对原始位置上右下左的方向
AC代码
import java.util.*;
public class Main{
public static void main(String[] args)
{
int[][] arr=new int[110][110];
Scanner scan=new Scanner(System.in);
int n=scan.nextInt();
int m=scan.nextInt();
int[] dx={-1,0,1,0};
int[] dy={0,1,0,-1};
int x=0,y=0,d=1,a=0,b=0;
for(int i=1;i<=n*m;i++)
{
arr[x][y]=i;
a=x+dx[d];
b=y+dy[d];
if(a<0||a>=n||b<0||b>=m||arr[a][b]!=0)
{
d=(d+1)%4;
a=x+dx[d];
b=y+dy[d];
}
x=a;
y=b;
}
for(int i=0;i<n;i++)
{
for(int j=0;j<m;j++)
{
System.out.print(arr[i][j]+" ");
}
System.out.println();
}
}
}