黑马程序员技术交流社区
标题:
怎样编出4阶螺旋方阵,原理?
[打印本页]
作者:
王新年
时间:
2013-12-7 14:50
标题:
怎样编出4阶螺旋方阵,原理?
怎样编出4阶螺旋方阵,原理?
如图:
1 2 3 4
12 13 14 5
11 16 15 6
10 9 8 7
作者:
肖川
时间:
2013-12-7 17:56
package com.demo.test;
public class Demo5
{
/**
* @param args
*/
public static void main(String[] args)
{
int n=4; //阶数
int mat[][] = new int [n][n];
int i,j,k=0;
for (i=0;i<(n+1)/2;i++) //i控制生成方阵的圈数,一圈内有4条边
{ //j控制生成一条边的数据
for (j=i;j<=n-i-1;j++) //顶边,从左到右,行不变列变
mat[i][j] = ++k; //k从1递增到n*n
for (j=i+1;j<=n-i-1;j++) //右边,从上到下,行变列不变
mat[j][n-i-1] = ++k;
for (j=n-i-2;j>=i;j--) //底边,从右到左,行不变列变
mat[n-i-1][j] = ++k;
for (j=n-i-2;j>=i+1;j--) //左边,从下到上,行变列不变
mat[j][i] = ++k;
}
for (i=0;i<mat.length;i++) //输出二维数组
{
for (j=0;j<mat[i].length;j++)
System.out.print(mat[i][j]+"\t");
System.out.println();
}
}
}
复制代码
作者:
王家胜
时间:
2013-12-7 21:30
import java.util.Scanner;
public class Test
{
public static void main(String[] args)
{
Scanner scan=new Scanner(System.in);
int n=scan.nextInt();
int[][] date=new int[n][n];
int number=1;
int xunhuan=0;//圈数
if(n/2==0)
{
xunhuan=n;//计算出循环圈数
}
else
{
xunhuan=n+1;//计算循环圈数
}
for(int m=0;m<xunhuan;m++)//矩阵的绘制
{
for(int i=m;i<n-m;i++)
{
date[m]<i>=number;
number++;
}
for(int i=m+1;i<n-m;i++)
{
date<i>[n-m-1]=number;
number++;
}
for(int i=n-m-2;i>=m;i--)
{
date[n-m-1]<i>=number;
number++;
}
for(int i=n-m-2;i>m;i--)
{
date<i>[m]=number;
number++;
}
}
for(int i=0;i<date.length;i++)//输出
{
for(int j=0;j<date<i>.length;j++)
{
System.out.print(date<i>[j]+"\t");
}
System.out.println("\t");
}
}
int xunhuan=n/3+1;
}
复制代码
你的问题是不清楚的,如果没做过的是不懂你的意思的,
生成的矩阵是n行n列
我不是在27届回答过你吗?
作者:
王明明
时间:
2013-12-7 23:54
本帖最后由 王明明 于 2013-12-7 23:59 编辑
class Demo
{
public static void main(String[] args)
{
jisuan(8,7);
}
public static void jisuan(int h,int l){//h代表行,l代表列
int mat[][] = new int [h][l];
int i,j,k=0;
for (i=0;i<(h+1)/2;i++) //i控制生成方阵的圈数 圈数跟行有关
{ //j表示要输出的数
for(j=i;j<l-i;j++){ //行不变列变 h不变 l变 l控制循环
mat[i][j] = ++k;
}
for(j=i+1;j<h-i;j++){ //行变列不变 h变 l不变 h控制循环
mat[j][l-i-1] = ++k;
}
for(j=l-i-2;j>=i;j--){ //行不变列变 h不变 l变 l控制循环 j=l-i-2 最大行数l减去圈数 - 右边已经输出一列 - 数组是0下标开始再减1 所以是l-i-2
mat[h-i-1][j] = ++k;
}
for(j=h-i-2;j>=i+1;j--){//行变列不变 h变 l不变 h控制循环 同上 j>=i+1 在第一圈快结束的时候 第一列 已经输出了 所以要+1
mat[j][i] = ++k;
}
}
复制代码
作者:
翼展哈哈
时间:
2013-12-9 22:13
楼主您好,
我原来遇到过一个这种算法题,叫做“蛇形填数”,下面是我提供的代码,楼主只要改变我的代码中的n值,就可以输出不同阶数的这种矩阵!
package com.day02;
public class shexingtianshu {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
int n = 6;
int[][] arr = new int[n][n];
int cnt = 1;
int i = 0, j = 0;
while( cnt <= n*n )
{
while( (j < n) && (arr[i][j] == 0) )
arr[i][j++] = cnt++;
i++;j--;
while( (i < n) &&(arr[i][j] == 0) )
arr[i++][j] = cnt++;
i--;j--;
while( (j >= 0) && (arr[i][j] == 0) )
arr[i][j--] = cnt++;
i--;j++;
while( (i >= 0) && (arr[i][j] == 0) )
arr[i--][j] = cnt++;
i++;j++;
}
for( int p = 0 ; p < n; p++ )
{
for( int q = 0; q < n; q++ )
System.out.printf("%5d",arr[p][q]);
System.out.println();
}
}
}
复制代码
希望可以帮到您,其实这种问题的原理就是技巧型的给二维数组赋值。如果您想知道的更多,那就在网上搜索一些蛇形填数的资料吧!
希望可以帮到您,有什么不对的欢迎批评指正!
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2