黑马程序员技术交流社区
标题:
如何将此代码优化成任意长宽的排列
[打印本页]
作者:
清风有意
时间:
2014-4-10 15:09
标题:
如何将此代码优化成任意长宽的排列
本人写的正方形代码如下:
package cn.itheima.exam;
/**
* 9、 写一方法,打印等长的二维数组,要求从1开始的自然数由方阵的最外圈向内螺旋方式地顺序排列。 如: n = 4 则打印:
* 1 2 3 4
* 12 13 14 5
* 11 16 15 6
* 10 9 8 7
*/
public class Test9 {
public static void main(String[] args) {
int[][] arr=new int[9][9];
circleArr(arr);
for(int x=0;x<arr.length;x++)
{
for(int y=0;y<arr[0].length;y++)
{
System.out.print(arr[x][y]+" \t ");
}
System.out.println();
}
}
private static void circleArr(int[][] arr) {
int x=0,y=0;
int max=arr.length-1;
int min=0;
int z=0;
for(;max>=min;){
for(;y<max;y++){
z++;
arr[x][y]=z;
}
for(;x<max;x++)
{ z++;
arr[x][y]=z;
}
for(;y>min;y--)
{ z++;
arr[x][y]=z;
}
for(;x>min;x--)
{
z++;
arr[x][y]=z;
}
if(max==min)
{
arr[x][y]=++z;
}
x++;
y++;
max--;
min++;
}
}
}
复制代码
作者:
ehuashao
时间:
2014-4-11 09:55
用类似树的深度搜索,走完一步,去搜索可走的下一步。注释很详细,不详解了。
public class Test99 {
public static void main(String[] args) {
Test99 test = new Test99();
//从键盘接收一个数,动态确定数组大小
System.out.println("请输入一个数,来作为您的二位数组长度:");
Scanner sc = new Scanner(System.in);
int chang = sc.nextInt();
System.out.println("请输入一个数,来作为您的二位数组宽度:");
int kuan = sc.nextInt();
int[][] arr = new int[chang][kuan];
//数组初始值都设置为0,代表每一位还没有被访问过。
for(int i=0;i<chang;i++){
for(int j=0;j<kuan;j++)
arr[i][j] = 0;
}
/*观察得数字运动路线为:右,下,左,上。所有定义变量来记录上一个数字运动方向。
右:1 下:2 左:3 上:4 .第一步肯定往右,所有move初始值为1.
*/
int move =1;
int step =0;//记录步数
int i=0,j=0;//初始位置
while(step < chang*kuan){
move = test.printArr(arr, i, j, move, chang,kuan);
switch(move){
case 1:
arr[i][j++] = ++step;
break;
case 2:
arr[i++][j] = ++step;
break;
case 3:
arr[i][j--] = ++step;
break;
case 4:
arr[i--][j] = ++step;
break;
case -1:
break;
}
}
//输出数组
for(int m=0;m<chang;m++){
for(int n=0;n<kuan;n++){
System.out.print(arr[m][n]+" ");
}
System.out.println("");
}
}
//根据上一步的运动,以及边界条件来判断下一步该往哪个方向运动
public int printArr(int[][]arr,int i,int j,int move,int chang,int kuan){
//如果上一步是向右走,则判断该位置右侧是否已被访问或已达边界,是返回2,指示下一步向下走,否则返回1继续向右走
if(move == 1){
if((j+1)>=kuan || arr[i][j+1] !=0){
return 2;
}
else return 1;
}
//如果上一步向下走,则判断该位置下面位置是否已被访问或已达边界,是返回3,指示下一步向左走,否返回2继续下走。
else if(move == 2){
if((i+1)>=chang || arr[i+1][j] != 0){
return 3;
}
else return 2;
}
//如果上一步向左走,则判断该位置左侧位置是否已被访问或已达边界,是返回4,指示下一步向上走,否返回3继续左走。
else if(move == 3){
if(j<=0 || arr[i][j-1] != 0){
return 4;
}
else return 3;
}
//如果上一步向上走,则判断该位置上面位置是否已被访问或已达边界,是返回1,指示下一步向右走,否返回4继续向上走。
else if(move == 4){
if(i<=0 || arr[i-1][j] != 0){
return 1;
}
else return 4;
}
return -1;
}
}
复制代码
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2