黑马程序员技术交流社区
标题:
螺旋矩阵的打印
[打印本页]
作者:
怀念子龙
时间:
2015-4-11 10:35
标题:
螺旋矩阵的打印
/*
* 螺旋矩阵的打印问题 (首先声明是自己解决,没百度,不知网上有什么好的方法)
* 矩阵n*n
* 关于螺旋矩阵的形成我们可以这样看:
* 首先第一行打印的是 1到n总共n个数,将这算作是第一步;
* 然后再行变而列不变 打印n-1个数,然后再行不变列变打印n-1个数,这算作是第二步;
* 后面的过程只是将n-1改为n-2 ..... 一直到1.总共n步。
* 可以验证 n*n= n+2(n-1)+2(n-2)+...+2*1.
*
* 关于第一步很好实现,第二步一直到第n步这每一步我们可以观察到数字打印的过程总是 先下后左 和先上后右。
* 如果前面一步是先下后左,下面一步就肯定是先上后右,同理也是一样。可以设置一个布尔值flag来记录这一过程。
*
*/
void fun(int n)
{
//用二维数组来存储
int[][] arr=new int[n][n];
int x=1;//打印的值从1开始 到n*n。
int a=0,b=n-1; //a,b记录每一步完成之后最后打印的数据所处二维数组的位置。
//标志第二步到第n步每一步的数据变化过程。先下后左为真,先上后右为假。
boolean flag=true;
//写入第一行。第一步
for(int i=0;i<n;i++)
{
arr[0][i]=x++;
}
//第二步到第 n步。
for(int k=n-1;k>=1;k--)
{
//先下后左
if(flag)
{
//写入列。
for(int p=1;p<=k;p++)
{
arr[a+p][b]=x++;
}
a=a+k;
//写入行
for(int q=1;q<=k;q++)
{
arr[a][b-q]=x++;
}
b=b-k;
}
//先上后右
else
{
for(int p=1;p<=k;p++)
{
arr[a-p][b]=x++;
}
a=a-k;
for(int q=1;q<=k;q++)
{
arr[a][b+q]=x++;
}
b=b+k;
}
flag=!flag;
}
//打印二维数组
for(int i=0;i<n;i++)
{
for(int j=0;j<n;j++)
{
System.out.print(arr[i][j]+"\t");
}
System.out.println();
}
}
复制代码
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2