导航:首页 > 编程语言 > 螺旋矩阵java

螺旋矩阵java

发布时间:2022-07-29 06:23:55

java螺旋矩阵

public class SpiralNumber {

/**
* @param args
*/
public static void main(String[] args) {

int number = 8;
int colNumber = number;

int[][] arys = printCircle(number);

for (int i = 0; i < number; i++) {
for (int j = 0; j < colNumber; j++) {
System.out.print(arys[i][j] + "\t");
}
colNumber--;

System.out.println();
}
}

private static int[][] printCircle(int number) {

int[][] ary = new int[number][number];

int rightLen;
int downLen;
int upLen;

int rightRow = 0;
int rightCol = 0;
int downRow = 1;
int downCol = number - 2;
int upRow = number - 2;
int upCol = 0;

int digit = 1;

while (number > 0) {

rightLen = number;
downLen = number - 1;
upLen = number - 2;

// Step 1: print to right
for (int i = 0, temp = rightCol; i < rightLen; i++) {
ary[rightRow][temp++] = digit++;
}

// Step 2: print to down
for (int j = 0, temp = downRow, colTemp = downCol; j < downLen; j++) {
ary[temp++][colTemp--] = digit++;
}

// move up
for (int n = 0, temp = upRow; n < upLen; n++) {
ary[temp--][upCol] = digit++;
}

number = number - 3;

// increas/decrease the row and column
rightRow++;
rightCol++;
downRow++;
downCol = downCol - 2;
upRow = upRow - 2;
upCol++;

}

return ary;

}

}

Ⅱ java螺旋矩阵求助!

package cn.com.micc.javatwo; //根据实际情况修改

//蜗牛螺旋矩阵 请仔细研究矩阵阶数变化时数据的迁移规律
//上一阶矩阵会"整体"向右上或左下移动

public class AntiClockWiseArray {
public static int[][] getResult(int n) {
int[][] n1 = new int[1][1];
n1[0][0] = 1;

if (n == 1)
return n1;

int[][] result = new int[n][n];
int[][] temp = getResult(n - 1);

if (0 == (n - 1) % 2)
result = LeftDownMove(temp, n - 1); //n-1阶矩阵向左下移动
else
result = RightUpMove(temp, n - 1); //n-1阶矩阵向右上移动

return result;
}

public static int[][] LeftDownMove(int[][] in, int moment) {
int temp = moment * moment;
int nums = moment * 2 + 1;

int[][] out = new int[moment + 1][moment + 1];

//新矩阵补入上一阶矩阵的值
for (int i = 0; i < moment; ++i)
for (int j = 0; j < moment; ++j)
out[i + 1][j] = in[i][j];

//两个循环添加新矩阵新值
for (int k = 0; k < moment + 1; ++k)
out[0][k] = temp + nums - k;
for (int l = 1; l < moment + 1; ++l)
out[l][moment] = temp + nums - moment - l;

return out;
}

public static int[][] RightUpMove(int[][] in, int moment) {
int temp = moment * moment;
int nums = moment * 2 + 1;

int[][] out = new int[moment + 1][moment + 1];

//新矩阵补入上一阶矩阵的值
for (int i = 0; i < moment; ++i)
for (int j = 0; j < moment; ++j)
out[i][j + 1] = in[i][j];

//两个循环添加新矩阵新值
for (int k = 0; k < moment + 1; ++k)
out[k][0] = temp + 1 + k;
for (int l = 1; l < moment + 1; ++l)
out[moment][l] = temp + moment + 1 + l;

return out;
}

public static void printArray(int[][] temp, int n) {

//格式化打印矩阵
for(int i = 0; i < n; ++i)
{
for(int j = 0; j < n; ++j)
System.out.printf("%5d", temp[i][j]);
System.out.println();
}
}
public static void main(String[] args) {
printArray(getResult(6), 6); //输入阶数
}
}

output:

10阶

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

Ⅲ 急!求JAVA螺旋矩阵的N*N算法(必须能运行的!!)

呵呵,大一做过的
package bao;

public class Juzhen {
public static void main(String[] args){
int k=1,i=0,j=0,m=0;
System.out.println("输入矩阵大小:");
int n=SavitchIn.readLineInt();
int[][] A=new int[n][n];
for(m=0;m<n;m++){
for(i=m,j=m;j<n-m;j++){
A[i][j]=k;k++;
}j--;
for(i=i+1;i<n-m;i++){
A[i][j]=k;k++;
}i--;
for(j=j-1;j>=m;j--){
A[i][j]=k;k++;
}j++;
for(i=i-1;i>m;i--){
A[i][j]=k;k++;
}i++;
}
for(int a=0;a<n;a++){
for(int b=0;b<n;b++){
System.out.print(A[a][b]+"\t");
}
System.out.println();
}
}
}

其中SavitchIn为
public class SavitchIn
{

/***
*Reads a line of text and returns that line as a String value.
*The end of a line must be indicated either by a new-line
*character '\n' or by a carriage return '\r' followed by a
*new-line character '\n'. (Almost all systems do this
*automatically. So, you need not worry about this detail.)
*Neither the '\n', nor the '\r' if present, are part of the
*string returned. This will read the rest of a line if the
*line is already partially read.
****/
public static String readLine()
{
char nextChar;
String result = "";
boolean done = false;

while (!done)
{
nextChar = readChar();
if (nextChar == '\n')
done = true;
else if (nextChar == '\r')
{
//Do nothing.
//Next loop iteration will detect '\n'
}
else
result = result + nextChar;
}

return result;
}
public static int readLineInt()
{
String inputString = null;
int number = -9999;//To keep the compiler happy.
//Designed to look like a garbage value.
boolean done = false;

while (! done)
{
try
{
inputString = readLine();
inputString = inputString.trim();
number = Integer.parseInt(inputString);
done = true;
}
catch (NumberFormatException e)
{
System.out.println(
"Your input number is not correct.");
System.out.println("Your input number must be");
System.out.println("a whole number written as an");
System.out.println("ordinary numeral, such as 42");
System.out.println("Minus signs are OK,"
+ "but do not use a plus sign.");
System.out.println("Please, try again.");
System.out.println("Enter a whole number:");
}
}

return number;
}
}

Ⅳ 求用java语言输出n*m阶螺旋矩阵

height就相当于n
width就相当于m

public class SpiralMatrixMaker {
public static void main(String[] args) {
int max = 20;
int i = 0, j = 0;
int height = 3;
int width = 4;
int[][] a = new int[max][max];

int m = 1, s = 1;
int x1 = 0;
int y1 = 0;
int x2 = height;
int y2 = width;
while (true) {
if (s == 1) {
for (; j < y2; j++) {
a[i][j] = m++;
}
j--;
i++;
y2--;
for (; i < x2; i++) {
a[i][j] = m++;
}
i--;
j--;
x2--;
s = -1;
} else {
for (; j >= y1; j--) {
a[i][j] = m++;
}
j++;
i--;
y1++;
for (; i >= x1 + 1; i--) {
a[i][j] = m++;
}
i++;
j++;
x1++;
s = 1;
}
if (m > height * width) {
break;
}
}
for (i = 0; i < height; i++) {
for (j = 0; j < width; j++) {
System.out.print(a[i][j]);
System.out.print("\t");
}
System.out.println();
}
}
}

Ⅳ 怎么编写JAVA螺旋矩阵

按照你的要求用Java编写的螺旋矩阵程序如下:
public class N {
public static void main(String[] args) {
final int N=4;
int a[][]=new int[N][N];
int num=1;
int i=0,j=0,m=0;
if(N%2==0)
m=N/2;
else
m=N/2+1;
for(i=0;i<=m-1;i++){
for(j=i;j<=N-i-1;j++){
a[i][j]=num;
num++;
}
for(j=i+1;j<=N-i-1;j++) {
a[j][N-i-1]=num;
num++;
}
for(j=N-i-2;j>=i;j--){
a[N-i-1][j]=num;
num++;
}
for(j=N-i-2;j>=i+1;j--){
a[j][i]=num;
num++;
}
}
for(i=0;i<N;i++){
for(j=0;j<N;j++){
System.out.print(String.format("%3d",a[i][j]));
}
System.out.println();
}
}
}
运行结果:
1 2 3 4
12 13 14 5
11 16 15 6
10 9 8 7

Ⅵ 谁有螺旋矩阵的说明

关于螺旋矩阵的说法不一,这里指的是形如
21 22................
20 7 8 9 10
19 6 1 2 11
18 5 4 3 12
17 16 15 14 13
的矩阵。

问题有两个:
1. 编程实现输出这个矩阵
2. 设1点的坐标是(0,0),x方向向右为正,y方向向下为正.例如:7的坐标为(-1,-1) ,2的坐标为(0,1),3的坐标为(1,1).编程实现输入任意一点坐标(x,y),输出所对应的数字。

1. 第一个问题我是采用模拟进行构造的,可以看到从1开始的方向变化始终是 right->down->left->up,
所持续走的长度为1->1->2->2->3->3->...,发现了这个规律不难写出代码了!注意下面我把1的位置设置
在((n-1)/2, (n-1)/2)的位置。

void Simulate(int n)
{
int x, y;
x = y = (n - 1) / 2; //1的位置
data[x][y] = 1;
int len = 1;
int count = 0;
int num = 2;
DIRECTION dir = RIGHT;
while(num <= n * n)
{
for(int i = 0; i < len; i++)
{
switch(dir)
{
case LEFT:
--y; break;
case RIGHT:
++y; break;
case UP:
--x; break;
case DOWN:
++x; break;
default: break;
}
data[x][y] = num++;
}
count++;
if(count == 2)
{
count = 0;
len++;
}
dir = (DIRECTION)((dir + 1) % 4);
}
}

2. 第二个问题我也是先找出规律,然后进行模拟。
首先,不难看出n*n的螺旋矩阵的右下角的坐标一定是(m, m),这里m=n-1
通过观察,可以看出 n=1的时候,右下角(0,0)的值为1,当n=2的时候,右下角(1,1)的坐标值为(3,3),当n=3的时候,右下角(2,2)的坐标值为13.直觉告诉我,这个值是关于n的二次函数,设f(n) = a*n^2 + b*n + c
联立方程组,可以求得a,b,c。 最终算出来的f(n) = 4*n^2 - 2*n + 1
下面再根据(x,y)和右下角(n-1,n-1)之间的关系,计算出值即可。这里要注意当x的值与n-1相同时,应优先考虑y与-m是否有联系。这就要求在函数中要注意x,y的判断先后顺序了。
代码如下:

//以(1,1)所在位置作为原点,向右作为x正半轴,向下作为y正半轴
int GetValue(int x, int y)
{
int m = max(abs(x), abs(y));
int rightBottom = m * m * 4 - 2 * m + 1;
int value = 0;
if(x == -m)
{
value = rightBottom + 2 * m + m - y;
}
else if( y == m)
{
value = rightBottom + m - x;
}
else if(y == -m)
{
value = rightBottom + 4 * m + x + m;
}
else if( x == m )
{
value = rightBottom - (m - y);
}

return value;
}

Ⅶ 2011全国软件设计大赛题真题,编程题:代码怎么写

10
#include<stdio.h>
int main( )
{
int a,b,c,d,e,f,g,h,i,j;
for(a=0;a<=1;a++)
for(b=0;b<=1;b++)
for(c=0;c<=1;c++)
for(d=0;d<=1;d++)
for(e=0;e<=1;e++)
for(f=0;f<=1;f++)
for(g=0;g<=1;g++)
for(h=0;h<=1;h++)
for(i=0;i<=1;i++)
for(j=0;j<=1;j++)
{
if(a==1&&b!=1) break;
if(c==0&&d!=0) break;
if(a==1&&c==1) break;
if((b==0&&d==0)||(b==1&&d==1)) break;
if(d+e+f+g+h<2) break;
if(c+g==1) break;
if(c+e+g+i>2) break;
if(e==1&&(f==0||g==0)) break;
if(f==1&&(g==1||h==1)) break;
if(i==1&&j==1&&h==0) break;

if(a) printf("A");
if(b&&a==1) printf(" B");
else if(b) printf("B");
if(c&&a+b!=0) printf(" C");
else if(c) printf("C");
if(d&&a+b+c!=0) printf(" D");
else if(d) printf("D");
if(e&&a+b+c+d!=0) printf(" E");
else if(e) printf("E");
if(f&&a+b+c+d) printf(" F");
else if(f) printf("F");
if(g&&a+b+c+d+e+f!=0) printf(" G");
else if(g) printf("G");
if(h&&a+b+c+d+e+f+g!=0) printf(" H");
else if(h) printf("H");
if(i&&a+b+c+d+e+f+g+h!=0) printf(" I");
else if(i) printf("I");
if(j&&a+b+c+d+e+f+g+h+i!=0) printf(" J");
else if(j) printf("J");
printf("\n");
}return 0;
}
8
#include<stdio.h>
#include<string.h>
int main( )
{
char as[200];
while(1)
{
gets(as);/*输入字符串*/
if(strlen(as)==0) break;
int i,j,k;
for(i=0;as[i]!='\0';i++)
if(as[i]!=' ')
break;
else printf(" ");/*判断最前面是否为空格*/
for(;as[i]!='\0';i++)
{
if(as[i]>='a'&&as[i]<='z')/*当遇到字母时*/
{ if(i-1<0||as[i-1]==' ')
printf("%c",as[i]-32);
else printf("%c",as[i]);
}
else
{
if(as[i]>='0'&&as[i]<='9')/*数字*/
{if((i-1<0||(as[i-1]<'0'||as[i-1]>'9'))&&as[i-1]!=' ')
printf("_%c",as[i]);
else
if((as[i+1]=='\0'||(as[i+1]<'0'||as[i+1]>'9'))&&as[i+1]!=' ')
printf("%c_",as[i]);
else printf("%c",as[i]);
}
else
if(as[i]==' ')/*空格*/
if(as[i-1]!=' ')
printf(" ");
}
}printf("\n");
}return 0;
}
9
#include<stdio.h>
int as[23][23],k;
void heng(int i1,int j1)
{
for(;;)
{
if(as[i1][j1]!=0) break;
as[i1][j1]=k;
j1++;k++;
}
return;
}
void xie(int i2,int j2)
{
for(;;)
{
if(as[i2][j2]!=0) break;
as[i2][j2]=k;
i2++;j2--;k++;
}
return;
}
void shu(int i3,int j3)
{
for(;;)
{
if(as[i3][j3]!=0) break;
as[i3][j3]=k;
i3--;
k++;
}
return;
}
int main( )
{
int n;
while(scanf("%d",&n)!=EOF)
{
int i,j; k=1;
for(i=0;i<n+3;i++)
for(j=0;j<n+3-i;j++)
as[i][j]=-1;
for(i=1;i<n+2;i++)
for(j=1;j<n+2-i;j++)
as[i][j]=0;
for(i=1,j=0;;i++)
{
if(j>=n) break; else {heng(i,i);j++;}
if(j>=n) break; else {xie(i+1,n+1-2*i);j++;}
if(j>=n) break; else {shu(n+1-2*i,i);j++;}
}
for(i=1;i<=n;i++)
{
for(j=1;j<n+2-i;j++)
if(j==1) printf("%d",as[i][j]);
else printf(" %d",as[i][j]);
printf("\n");
}
}
return 0;
}

Ⅷ 谁用java写过最短的螺旋矩阵分享一下,下面是我写的!

写得太复杂了,if else语句最好不要这样用

Ⅸ java二维数组3*3螺旋矩阵实例,请解释下循环的过程

publicclassT{

publicstaticvoidmain(String[]args){
inti,j;
int[][]a={{1,1,1},{2,2,2},{3,3,3}};
int[][]b=newint[3][3];
System.out.print("初始矩阵: ");
for(i=0;i<3;i++){
for(j=0;j<3;j++){
System.out.print(a[i][j]+"");
}
System.out.print(" ");
}
System.out.print("转置矩阵: ");
for(i=0;i<3;i++){
for(j=0;j<3;j++){
b[i][j]=a[j][i];
System.out.print(b[i][j]+"");
}
System.out.print(" ");
}
}
}

Ⅹ 如何用JAVA实现螺旋矩阵

import java.io.*;public class RingDemo {
public static void main(String[] args) {
String strIn = "";
System.out.print("请输入矩阵的行列数:");
InputStreamReader input = new InputStreamReader(System.in);
BufferedReader buff = new BufferedReader(input);
try {
strIn = buff.readLine();
} catch (IOException e) {
System.out.println(e.toString());
}
int int1 = Integer.parseInt(strIn);
int n = int1;
System.out.println("这是行列数为" + n + "的螺线型数组:");
int intA = 1; // 初始化
int[][] array = new int[n][n];
int intB;
if (n % 2 != 0) {
intB = n / 2 + 1; // 奇数时i循环次数
} else
intB = n / 2; // 偶数时i循环次数
for (int i = 0; i < intB; i++) { // 从外到里循环
// 从左到右横的开始
for (int j = i; j < n - i; j++) {
array[i][j] = intA;
intA++;
}
// 从上到下纵
for (int k = i + 1; k < n - i; k++) {
array[k][n - i - 1] = intA;
intA++;
}
// 从右到左横
for (int l = n - i - 2; l >= i; l--) {
array[n - i - 1][l] = intA;
intA++;
}
// 从下到上纵
for (int m = n - i - 2; m > i; m--) {
array[m][i] = intA;
intA++;
}
}
// 输出数组
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
System.out.print(array[i][j] + " ");
}
System.out.println();
} }
}

阅读全文

与螺旋矩阵java相关的资料

热点内容
win10原始解压软件 浏览:319
阿里程序员的老家 浏览:258
量子加密银行 浏览:193
命令方块获得指令手机 浏览:499
学习结束感言简短程序员 浏览:398
android关机闹钟实现 浏览:968
鼠标一键打开文件夹设置 浏览:161
程序员看过来我想静静搞笑视频 浏览:370
curlphp爬虫 浏览:874
python按日期循环 浏览:110
php三个等号 浏览:760
培训班出来的程序员解决问题很差 浏览:963
程序员那么可爱25集 浏览:753
服务器地址和ip地址一样不 浏览:664
php中括号定义数组 浏览:602
php打印堆栈 浏览:516
华为adb命令行刷机 浏览:965
人像摄影pdf 浏览:761
解压文件密码怎样重新设置手机 浏览:1002
高考指南pdf 浏览:695