笔试遇到了一个题目,如何对所输入的n,实现一个螺旋输出的n*n矩阵,当时没想好,回来以后想了一个和大部分答案不大一样的新办法,大家可以看看
代码如下
public class pc {
public static void main(String[] args) {
//输入矩阵规模
int n=new Scanner(System.in).nextInt();
int[][] A=computeCycle(n, 1);//逐层计算
int[][]temp=null;
int m=n;
int initial=A[1][0]+1;
if(n%2==0) {//偶数规模
while(m>2) {//递归合并
temp=computeCycle(m-2, initial);
A=connect2mat(A, temp, m-2, n);
m-=2;
initial=temp[1][0]+1;
}
}else {//奇数规模
while(m>3) {
temp=computeCycle(m-2, initial);
A=connect2mat(A, temp, m-2, n);
m-=2;
initial=temp[1][0]+1;
}
A[n/2][n/2]=n*n;
}
for(int x=0;x!=n;++x) {
for(int y=0;y!=n;++y) {
System.out.print(A[x][y]+"\t");
}
System.out.println();
}
}
public static int[][] computeCycle(int n,int initial) {
int[][] A=new int[n][n];
if(n==1) {
A[0][0]=initial;
}else {
/* 核心算法 */
//第一层-上
for(int x=0;x!=n;++x) {
A[0][x]=x+initial;
}
//第一层-右
for(int x=1;x!=n;++x) {
A[x][n-1]=x+A[0][n-1];
}
//第一层-下
int i=1;
for(int x=n-2;x!=-1;--x) {
A[n-1][x]=A[n-1][n-1]+i++;
}
//第一层-左
int j=1;
for(int x=n-2;x!=0;--x) {
A[x][0]=A[n-1][0]+j++;
}
}
return A;
}
public static int[][] connect2mat(int[][]A,int[][]B,int n,int m) {
int temp=(m-n)/2;
for(int a=0;a!=n;++a) {
for(int b=0;b!=n;++b) {
A[a+temp][b+temp]=B[a][b];
}
}
return A;
}
}
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/153562.html