java打印螺旋方阵

im110 2008-01-14 10:07:26

package topcoder;
/*
* 下面是一个5*5阶的螺旋方阵.试编程打印出此形式的n*n(n<10)阶的方阵(顺时针方向旋进).
* 1 2 3 4 5
* 16 17 18 19 6
* 15 24 25 20 7
* 14 23 22 21 8
* 13 12 11 10 9
*/
public class screwSquare
{
public static void main(String[] args) {
if (args.length == 0) {
System.out.println("usage: \"java screwSquare integer.\"");
System.exit(0);
}
int i = Integer.parseInt(args[0]);
int[][] matrix = new int[i][i];
int max = i * i;
int row = 0, col = 0;
int direction = 0;
for (int j = 1; j <= max; j++) {
matrix[row][col] = j;
switch (direction) {
case 0:
if (col + 1 >= i || matrix[row][col + 1] > 0) {
direction += 1;
direction %= 4;
row += 1;
} else {
col = col + 1;
}
break;
case 1:
if (row + 1 >= i || matrix[row + 1][col] > 0) {
direction += 1;
direction %= 4;
col -= 1;
} else {
row = row + 1;
}
break;
case 2:
if (col - 1 < 0 || matrix[row][col - 1] > 0) {
direction += 1;
direction %= 4;
row = row - 1;
} else {
col = col - 1;
}
break;
case 3:
if (row - 1 < 0 || matrix[row - 1][col] > 0) {
direction += 1;
direction %= 4;
col += 1;
} else {
row = row - 1;
}
break;
default:
System.out.println("ERROR");
System.exit(0);
}
}
for (int j = 0; j < i; j++) {
for (int k = 0; k < i; k++) {
if (matrix[j][k] < 10)
System.out.print(" " + matrix[j][k]);
else
System.out.print(" " + matrix[j][k]);
}
System.out.println("");
}
}
}



这是本人在网上找到的一个打印螺旋方阵的程序.有一个地方看不太懂.如switch-case语句中第一个判断方向的语句if (col + 1 >= i || matrix[row][col + 1] > 0) {
direction += 1;
direction %= 4;
row += 1;
} else {
col = col + 1;
}
break;

我知道if后边括号里的表达式是判断方向的,但我只能看懂col+1>=i后边一名 matrix[row][col + 1] > 0是何用途就看不懂了。郁闷ING。。。请教高人。。。
...全文
1764 20 打赏 收藏 转发到动态 举报
写回复
用AI写文章
20 条回复
切换为时间正序
请发表友善的回复…
发表回复
jikeyuan1 2010-10-19
  • 打赏
  • 举报
回复



package assign4;

import java.util.Scanner;

public class luoxuan {

/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
int [][]a;
a=new int[10][10];

int i,j,k,n;
System.out.println("Please input n(0<n<10):");
System.out.println("please one number:");
Scanner inputscan2 = new Scanner((System.in));
n = inputscan2.nextInt();
k=1;
for(i=0;i<n/2;i++)
{
for(j=i;j<n-i-1;j++) //1 1 1 1 2
a[i][j]=k++; //4 5 5 6 2
for(j=i;j<n-i-1;j++) //4 8 6 2
a[j][n-i-1]=k++; //4 8 7 7 2
for(j=n-i-1;j>i;j--) //4 3 3 3 3
a[n-i-1][j]=k++;
for(j=n-i-1;j>i;j--)
a[j][i]=k++;
}
if(n%2==1)
a[n/2][n/2]=k;
for(i=0;i<n;i++)
{
for(j=0;j<n;j++)
System.out.print(" "+a[i][j]);
System.out.println("\n");
}
}


}
huangjiawei579 2010-01-04
  • 打赏
  • 举报
回复
小的数论问题。
奋斗并快乐着 2008-01-19
  • 打赏
  • 举报
回复
献丑,想法是转圈填数
int n=10;
int[][] arr = new int[n][n];
int[][] add = {{0,1}, {1,0}, {0,-1}, {-1,0}};
int addId = 0;
int nextRow = 0;
int nextCol = 0;
for(int i=1; i<=n*n; i++){
arr[nextRow][nextCol] = i;
nextRow = row+add[addId][0];
nextCol = col+add[addId][1];
if(nextRow < 0 || nextRow >= n || nextCol < 0 || nextCol >= n || arr[nextRow][nextCol] != 0){
addId = (addId + 1)%4;
nextRow = row+add[addId][0];
nextCol = col+add[addId][1];
}
}
for(int i=0; i<n; i++){
for(int j=0; j<n; j++){
System.out.println(arr[i][j] + " ");
}
System.out.println();
}
chuting1 2008-01-19
  • 打赏
  • 举报
回复
import java.text.DecimalFormat;

public class juzhen{//回旋矩阵 n*n
public static void main(String args[])
throws java.io.IOException{
int n;//矩阵维数
n=System.in.read()-'0';


int x,y,i=1;
int jz[][]=new int [n][n];
int dir =0;
//初始化
for(x=0;x<n;x++)//行
for(y=0;y<n;y++)
{
jz[x][y]=0; //i
//i++;
}

x=0;y=0;dir=0;
for(i=0;i<n*n;i++)
{
if(jz[x][y]!=0) //已填充数字
{
switch(dir)
{
case 0:
y--;
x++;
dir=1;
break;
case 1:
x--;
y--;
dir=2;
break;
case 2:
y++;
x--;
dir=3;
break;
case 3:
x++;
y++;
dir=0;
break;
}
}
if(jz[x][y]==0) //未填数字,填入
{
jz[x][y]=i+1;
switch(dir)
{
case 0:
y++;
if(y==n)
{
y--;x++;dir=1;
}
break;
case 1:
x++;
if(x==n)
{
x--;y--;dir=2;
}
break;
case 2:
if(y==0)
{
x--;dir=3;
}
else
y--;
break;
case 3:
if(x==0)
{
y++;dir=0;
}
else
x--;
break;
}
}
}

DecimalFormat df = new DecimalFormat(" 00");

//pri
for (x=0;x<n ;x++ )
{
for (y=0;y<n ;y++ )

{
System.out.print(df.format(jz[x][y]) + " ");

}
System.out.print("\n");
}
}
}
im110 2008-01-18
  • 打赏
  • 举报
回复
特别感谢redraiment 大哥.
maquan 2008-01-18
  • 打赏
  • 举报
回复
又想了一下,用“递归”好像有点故弄玄虚了,直接填充就好了 :)
public class ScrewSquare {

public static void main(String[] args) {
ScrewSquare o = new ScrewSquare();
o.fill();
o.print();
}

int w, h;
int[][] array;
int left, top, right, bottom;
int start;

public ScrewSquare() {
w = 5;
h = 5;
array = new int[w][h];
left = 0;
top = 0;
right = w - 1;
bottom = h - 1;
start = 1;
}

public void fill() {
while (left <= right && top <= bottom) {
for (int x=left; x<=right; x++)
array[x][top] = start++;

for (int y=top+1; y<=bottom; y++)
array[right][y] = start++;

for (int x=right-1; x>=left; x--)
array[x][bottom] = start++;

for (int y=bottom-1; y>=top+1; y--)
array[left][y] = start++;

left ++; top ++; right --; bottom --;
}
}

public void print() {
for (int y=0; y<h; y++) {
for (int x=0; x<w; x++) {
System.out.printf("%2d ", array[x][y]);
}
System.out.println();
}
}
}
quietwave 2008-01-18
  • 打赏
  • 举报
回复
借用楼主的部分代码,用Java改写一下

public   class   ScrewSquare
{
int n = 0;

public ScrewSquare(int n){
this.n = n;
}

private int getElement(int i,int j){
int mid = n/2;
int k = Math.min( Math.min(i,j) ,n -1 - Math.max(i,j));
int sum = 4 * ( k * (n + 1) - k * (k+1));
if( j >= i) sum += (i+j) - 2*k + 1;
else sum += ( n - 2*k - 1) * 4 - (i+j) + 2*k + 1;
return sum;
}

public void print(){
for(int i = 0 ; i < n;i++){
for(int j = 0; j < n;j++)
System.out.print(" " + getElement(i,j));
System.out.println();
}
}

public static void main(String[] args) {
if (args.length == 0) {
System.out.println("usage: \"java screwSquare integer.\"");
System.exit(0);
}
int n = Integer.parseInt(args[0]);

new ScrewSquare(n).print();
}

}
quietwave 2008-01-18
  • 打赏
  • 举报
回复
贴一下我以前编的
用C编的,主要思想是
将a[i][j]用 i,j,n的函数表示
给定 i,j,n想办法用数学的方法算出该位上的数字

#include<stdio.h>
#include<math.h>
#include<stdlib.h>

int getElement(int i,int j,int n){
int mid = n/2;
int k = min( min(i,j) ,n -1 - max(i,j));
int sum = 4 * ( k * (n + 1) - k * (k+1));
if( j >= i) sum += (i+j) - 2*k + 1;
else sum += ( n - 2*k - 1) * 4 - (i+j) + 2*k + 1;
return sum;
}

int main(){
int n,i,j;

printf(" n = ");
scanf("%d",&n);

for(i = 0 ; i < n;i++){
for(j = 0 ; j < n;j++)
printf("%5d ",getElement(i,j,n));
printf("\n");
}
return 0;
}
token1984 2008-01-17
  • 打赏
  • 举报
回复
mark
changjiangzhibin 2008-01-17
  • 打赏
  • 举报
回复
顶一下,数据结构呀
maquan 2008-01-17
  • 打赏
  • 举报
回复
用递归喽,程序如下,还挺简单的,我就不解释了吧……

public class ScrewSquare {

public static void main(String[] args) {
int w = 5;
int h = 5;
int[][] array = new int[w][h];
fill(array, 0, 0, w-1, h-1, 1);
for (int y=0; y<h; y++) {
for (int x=0; x<w; x++) {
System.out.printf("%2d ", array[x][y]);
}
System.out.println();
}
}

public static void fill(int[][] array, int left, int top, int right, int bottom, int start) {
if (left > right || top > bottom) return;

for (int x=left; x<=right; x++)
array[x][top] = start++;

for (int y=top+1; y<=bottom; y++)
array[right][y] = start++;

for (int x=right-1; x>=left; x--)
array[x][bottom] = start++;

for (int y=bottom-1; y>=top+1; y--)
array[left][y] = start++;

fill(array, left+1, top+1, right-1, bottom-1, start);
}
}
redraiment 2008-01-17
  • 打赏
  • 举报
回复
matrix[row][col+1]> 0用途是这样的:

首先,java里定义一个数组后,如果没有赋初始值,则为0。这和C\C++不一样。
它的判断语句就是判断在这个方向上是不是已经走到头了,是不是要换方向了。
开始的手后,5*5的矩阵里都是0,一个个赋值。开始都是用col+1>=i这些判断就可以,但是到了下面这个情况
1 2 3 4 5
0 0 0 0 6
15 0 0 0 7
14 0 0 0 8
13 12 11 10 9
填上16以后,已经要转方向了,但并没有到头。也就是col-1<0不成立。
此时就是用matrix[row][col+1]> 0来判断。前面的算不算已经被赋值过了。
这样就可以把方向转掉了。
Slugfest 2008-01-16
  • 打赏
  • 举报
回复
这是我小时候学Basic时代的题目了,那个时候会,现在懒得去想了。
im110 2008-01-16
  • 打赏
  • 举报
回复
唉,我已经看了四天时间还是没看懂.有没有人就回答我一句话呢: matrix[row][col+1]>0 是何用途???
拜托我是菜鸟.不要说太高深的东西了...
shan1119 2008-01-15
  • 打赏
  • 举报
回复
一个高手写的.你看看,感觉还是比较好理解的.
import java.text.DecimalFormat;


public class HelixMatrix {
private int[][] array;
private int m,n;
public HelixMatrix(int m, int n) {
this.m = m;
this.n = n;
array = new int[m][];
for(int i = 0; i < m; i++)
array[i] = new int[n];
}

private void fill() {
int count = m * n;
int direct = 0;
int round = 1;
for(int index = 1, x = 0, y = 0; index <= count; index++) {
array[x][y] = index;
switch(direct) {
case 0: //向右
if(y < n - round)
y++;
else {
direct = 1;
x++;
}
break;
case 1:
if(x < m - round)
x++;
else {
direct = 2;
y--;
}
break;
case 2:
if(y >= round)
y--;
else {
direct = 3;
x--;
}
break;
case 3:
if(x > round)
x--;
else {
direct = 0;
round++;
y++;
}
break;
}
}
}

private void printMatrix() {
DecimalFormat df = new DecimalFormat(" 000");
for(int i = 0; i < m; i++) {
for(int j = 0; j < n; j++)
System.out.print(df.format(array[i][j]));
System.out.println();
}
}

public static void main(String[] args) {
HelixMatrix matrix = new HelixMatrix(8,6);
matrix.fill();
matrix.printMatrix();
}


}
cangyue87 2008-01-15
  • 打赏
  • 举报
回复
数据结构,又见数据结构....

继续埋头补充知识...
老紫竹 2008-01-15
  • 打赏
  • 举报
回复
我只提示一句,剩下的你自己完成。

右螺旋就是 多叉树的左深度遍历
梅小西Echo 2008-01-15
  • 打赏
  • 举报
回复
/*
轮回矩阵
阿长最近迷上了一种矩阵,他认为通过分析这种图形可以参悟人的生死轮回(狂汗。。。)。
这个图形由1到n*n这些数字组成。n表示一个人的年龄。比如,当一个人的年龄为4的时候,
那么对于他的轮回矩阵就是如下的一个图形:
1 2 3 4
12 13 14 5
11 16 15 6
10 9 8 7
从左上角的1开始,以顺时针的方向进行旋涡式的伸展。这样的一个图形我们称它为
4岁的轮回矩阵。为了更好的研究这些矩阵,阿长不得不再次求助于你,希望你能编
写一个程序,当我们输入一个人的年龄的时候,你的程序能生成一个对于该年龄轮回矩阵。

输入:
一个数字n,表示年龄。对于30%的数据,n<=50,对于100%的数据,n<=500(汗,谁活了
这么久。。。。)。

输出:
轮回矩阵的结构图。每行的数字之间用一个空格分开,注意每行最后一个数字后面不要留有空格。
无须考虑数字的对齐问题。

样例输入1:
4

样例输出1:
1 2 3 4
12 13 14 5
11 16 15 6
10 9 8 7

样例输入2:
10

样例输出2:

1 2 3 4 5 6 7 8 9 10
36 37 38 39 40 41 42 43 44 11
35 64 65 66 67 68 69 70 45 12
34 63 84 85 86 87 88 71 46 13
33 62 83 96 97 98 89 72 47 14
32 61 82 95 100 99 90 73 48 15
31 60 81 94 93 92 91 74 49 16
30 59 80 79 78 77 76 75 50 17
29 58 57 56 55 54 53 52 51 18
28 27 26 25 24 23 22 21 20 19

【华中科技大学计算机学院第三届程序设计大赛试题】
*/



import java.util.*;
import java.io.*;
public class arrayTest
{
public static void main(String[] arg) throws NumberFormatException, IOException
{
System.out.println("请输入N:");
BufferedReader read = new BufferedReader(new InputStreamReader(System.in));
int x = Integer.parseInt(read.readLine());
int count = (x / 2) + 1;
int k = x;
int[][] a = new int[k][k];
for( int i = 1; i <= count; i++ )
{
for( int n = i - 1; n <= k - i; n++ )
{
if( i == 1 && n == 0 )
a[i-1][n] = 1;
else
a[i-1][n] = a[i-1][n-1] + 1;
}

for( int n = i; n <= k - i; n++ )
{
a[n][k-i] = a[n-1][k-i] + 1;
}

for( int n = k - i - 1; n >= i - 1; n-- )
{
a[k-i][n] = a[k-i][n+1] + 1;
}

for( int n = k - i - 1; n >= i; n-- )
{
a[n][i-1] = a[n+1][i-1] + 1;
}
}
for( int i = 0; i < k; i++ )
{
for( int j = 0; j < k; j++ )
{
if( a[i][j] <= 9 )
{
System.out.print(" "+a[i][j]);
}
else
System.out.print(" "+a[i][j]);
}
System.out.println();
}
}
}
sidenycc 2008-01-15
  • 打赏
  • 举报
回复
public class LuoXuan{
class zuoBiao{
private int x;
private int y;
private zuoBiao next;
public zuoBiao(int m,int n){
this(m,n,null);
}
public zuoBiao(int m,int n,zuoBiao s){
x=m;
y=n;
next=s;
}
}
private zuoBiao head;
public LuoXuan(){
head=new zuoBiao(0,0);
}
public int OneCircle(int n){
zuoBiao temp=head;
int i=0,mark=n;
for(;n>=1;n=n-2,i=i+1){
temp.next=new zuoBiao(i,i);
temp=temp.next;
while(temp.y<n+i-1){
temp.next=new zuoBiao(temp.x,temp.y+1);
temp=temp.next;
}
while(temp.x<n+i-1){
temp.next=new zuoBiao(temp.x+1,temp.y);
temp=temp.next;
}
while(temp.y>i){
temp.next=new zuoBiao(temp.x,temp.y-1);
temp=temp.next;
}
while(temp.x>i+1){
temp.next=new zuoBiao(temp.x-1,temp.y);
temp=temp.next;
}

}
return mark;
}
public void Print(int n){
int[][] Diagram=new int[n][n];
zuoBiao temp=head.next;
int i=1;
while(temp!=null){
int x=temp.x;
int y=temp.y;
Diagram[x][y]=i;
i++;
temp=temp.next;
}
for(int k=0;k<Diagram.length;k++){
for(int j=0;j<Diagram[k].length;j++)
System.out.print(Diagram[k][j]+"\t");
System.out.println();
}
}
public static void main(String[] args){
LuoXuan luoXuan1=new LuoXuan();
luoXuan1.Print(luoXuan1.OneCircle(6));
}
}
sidenycc 2008-01-15
  • 打赏
  • 举报
回复
我是菜鸟,也写了个,写得有点复杂
public class LuoXuan{
class zuoBiao{
private int x;
private int y;
private zuoBiao next;
public zuoBiao(int m,int n){
this(m,n,null);
}
public zuoBiao(int m,int n,zuoBiao s){
x=m;
y=n;
next=s;
}
}
private zuoBiao head;
public LuoXuan(){
head=new zuoBiao(0,0);
}
public int OneCircle(int n){
zuoBiao temp=head;
int i=0,mark=n;
for(;n>=1;n=n-2,i=i+1){
temp.next=new zuoBiao(i,i);
temp=temp.next;
while(temp.y<n+i-1){
temp.next=new zuoBiao(temp.x,temp.y+1);
temp=temp.next;
}
while(temp.x<n+i-1){
temp.next=new zuoBiao(temp.x+1,temp.y);
temp=temp.next;
}
while(temp.y>i){
temp.next=new zuoBiao(temp.x,temp.y-1);
temp=temp.next;
}
while(temp.x>i+1){
temp.next=new zuoBiao(temp.x-1,temp.y);
temp=temp.next;
}

}
return mark;
}
public void Print(int n){
int[][] Diagram=new int[n][n];
zuoBiao temp=head.next;
int i=1;
while(temp!=null){
int x=temp.x;
int y=temp.y;
Diagram[x][y]=i;
i++;
temp=temp.next;
}
for(int k=0;k<Diagram.length;k++){
for(int j=0;j<Diagram[k].length;j++)
System.out.print(Diagram[k][j]+"\t");
System.out.println();
}
}
public static void main(String[] args){
LuoXuan luoXuan1=new LuoXuan();
luoXuan1.Print(luoXuan1.OneCircle(6));
}
}

62,614

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧