我写了一半,从1算到10还行,11以上就不对了,请高手看看吧。package mypackage;public class Main {
public Main() {
}
public static void main(String[] args) {
int n=4; //计算n阶方阵
int i=0,j=0;
int[][] d = new int[n][n];
boolean ic=false;
d[0][0]=1;
for (int k=2;k<=10;k++){
//上面这行的“10”应该是n ,从左上角开始,计算到“左下-右上”的主对角线是正确的。
//右下方不能填充。高手看看能否解决。
if (ic){
i++; if (i>=n-1) {i=n-1;ic=false;}
j--; if (j<0) {j=0;ic=false;}
}
else {
i--; if (i<0) {i=0;ic=true;}
j++; if (j>=n-1) {j=n-1;ic=true;}
}
d[i][j]=k;
}
for(int k1=0;k1<n; k1++){
for (int k2=0; k2<n; k2++){
System.out.print("\t" + d[k1][k2]);
}
System.out.println();
}
// TODO code application logic here
}
}
public Main() {
}
public static void main(String[] args) {
int n=4; //计算n阶方阵
int i=0,j=0;
int[][] d = new int[n][n];
boolean ic=false;
d[0][0]=1;
for (int k=2;k<=10;k++){
//上面这行的“10”应该是n ,从左上角开始,计算到“左下-右上”的主对角线是正确的。
//右下方不能填充。高手看看能否解决。
if (ic){
i++; if (i>=n-1) {i=n-1;ic=false;}
j--; if (j<0) {j=0;ic=false;}
}
else {
i--; if (i<0) {i=0;ic=true;}
j++; if (j>=n-1) {j=n-1;ic=true;}
}
d[i][j]=k;
}
for(int k1=0;k1<n; k1++){
for (int k2=0; k2<n; k2++){
System.out.print("\t" + d[k1][k2]);
}
System.out.println();
}
// TODO code application logic here
}
}
//上面这行的“10”应该是n*n ,从左上角开始,计算到“左下-右上”的主对角线是正确的。
^
完成后半部分的输出!/********************************************/
package mypackage;public class matrix {
/**
* To implement the matrix
* For yiyu2004 (依隅) question
* @author jany0654
*/
public matrix() {
}
public static void main(String[] args) {
int n=6;
//计算n阶方阵
int[][] matrix = new int[n][n];
boolean ic=false;
matrix[0][0]=1;
matrix[n-1][n-1]= n*n;
int i=0,j=0;
for (int k=2; k<=((n*(n+1))/2); k++){
//(n*(n+1))/2 ,从左上角开始,计算到“左下-右上”的主对角线是正确的。
if (ic){
i++;
if (i>=n-1) {
i=n-1;
ic=false;
}
j--;
if (j<0) {
j=0;
ic=false;
}
}
else {
i--;
if (i<0) {
i=0;
ic=true;
}
j++;
if (j>=n-1) {
j=n-1;
ic=true;
}
}
matrix[i][j]=k;
}
i=0;
j=0;
ic=false;
for (int k=((n*n)-1);k>=((n*(n+1))/2);k--){
if (ic){
i++;
if (i>=(n-1)) {
i=n-1;
ic=false;
}
j--;
if (j<0) {
j=0;
ic=false;
}
}else {
i--;
if (i<0) {
i=0;
ic=true;
}
j++;
if (j>=n-1) {
j=n-1;
ic=true;
}
}
matrix[n-i-1][n-j-1]=k;
}
for(int outX = 0; outX<n; outX++){
for (int outY=0; outY<n; outY++){
System.out.print("\t" + matrix[outX][outY]);
}
System.out.println();
}
// TODO code application logic here
}
}
/*******************************************************/
n=6 的输出结果 1 2 6 7 15 16
3 5 8 14 17 26
4 9 13 18 25 27
10 12 19 24 28 33
11 20 23 29 32 34
21 22 30 31 35 36
package cn.edu.xjtu.bmyjava;
import java.util.Scanner;
class PrintMatrix {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int n=scanner.nextInt();
int i = 0, j = 0;
int[][] d = new int[n][n];
boolean ic = false;
d[0][0] = 1;
d[n - 1][n - 1] = n * n;
int k=2,kk=n*n-1,kkk=(n*n-n)/2+n;;
while(k<=kkk) {
if (ic) {
i++;
if (i >= n - 1) {
i = n - 1;
ic = false;
}
j--;
if (j < 0) {
j = 0;
ic = false;
}
} else {
i--;
if (i < 0) {
i = 0;
ic = true;
}
j++;
if (j >= n - 1) {
j = n - 1;
ic = true;
}
}
d[i][j] = k;
k++;
}
int ii = n - 1, jj = n - 1;
boolean flag = false;
while(kk>kkk) {
if (flag) {
ii--;
if (ii <= 1) {
ii = 1;
flag = false;
}
jj++;
if (jj > n - 1) {
jj = n - 1;
flag = false;
}
} else {
ii++;
if (ii > n - 1) {
ii = n - 1;
flag = true;
}
jj--;
if (jj <= 1) {
jj = 1;
flag = true;
}
}
d[ii][jj] = kk;
kk--;
}
for (int w = 0; w < n; w++) {
for (int s = 0; s < n; s++) {
System.out.printf("%3d",d[w][s]);
System.out.print(" ");
}
System.out.println();
}
}
}
运行结果:
11(此数从控制台输入)
1 2 6 7 15 16 28 29 45 46 66
3 5 8 14 17 27 30 44 47 65 67
4 9 13 18 26 31 43 48 64 68 85
10 12 19 25 32 42 49 63 69 84 86
11 20 24 33 41 50 62 70 83 87 100
21 23 34 40 51 61 71 82 88 99 101
22 35 39 52 60 72 81 89 98 102 111
36 38 53 59 73 80 90 97 103 110 112
37 54 58 74 79 91 96 104 109 113 118
55 57 75 78 92 95 105 108 114 117 119
56 76 77 93 94 106 107 115 116 120 121
或: 1 3 4 10 11 21 22 36 37 55 56
问你后面的数是什么, 这种Case还是有的。
/**
* To implement the matrix
* For yiyu2004 (依隅) question
* @author jany0654, rower203改写
*/
private int matrixNum;
public SnakeMatrix(int n) {
matrixNum = n;
}
public int[][] getMatrix(){
//计算n阶方阵
int[][] matrix = new int[matrixNum][matrixNum];
boolean ic=false;
matrix[0][0]=1;
matrix[matrixNum-1][matrixNum-1]= matrixNum*matrixNum;
int i=0,j=0;
for (int k=2; k<=((matrixNum*(matrixNum+1))/2); k++){
//(n*(n+1))/2 ,从左上角开始,计算到“左下-右上”的主对角线是正确的。
if (ic){
i++;
if (i>=matrixNum-1) {
i=matrixNum-1;
ic=false;
}
j--;
if (j<0) {
j=0;
ic=false;
}
}
else {
i--;
if (i<0) {
i=0;
ic=true;
}
j++;
if (j>=matrixNum-1) {
j=matrixNum-1;
ic=true;
}
}
matrix[i][j]=k;
}
i=0;
j=0;
ic=false;
for (int k=((matrixNum*matrixNum)-1);k>=((matrixNum*(matrixNum+1))/2);k--){
if (ic){
i++;
if (i>=(matrixNum-1)) {
i=matrixNum-1;
ic=false;
}
j--;
if (j<0) {
j=0;
ic=false;
}
}else {
i--;
if (i<0) {
i=0;
ic=true;
}
j++;
if (j>=matrixNum-1) {
j=matrixNum-1;
ic=true;
}
}
matrix[matrixNum-i-1][matrixNum-j-1]=k;
}
return matrix;
}
public void outputResult(int[][] matrix, int n, boolean isRotation){
for (int outY = 0; outY < matrixNum; outY++){
int x = n - 1, y = outY;
if(isRotation){
y = x;
x = outY;
}
System.out.print("\t" + matrix[x][y]);
}
System.out.println();
}
public void outputResult(int[][] matrix, int n){
outputResult(matrix, n, false);
}
public void outputResult(int[][] matrix){
for(int outX = 0; outX < matrixNum; outX++){
outputResult(matrix, outX + 1, false);
}
}
public static void main(String[] args) {
SnakeMatrix sm = new SnakeMatrix(11);
// sm.outputResult(sm.getMatrix());
sm.outputResult(sm.getMatrix(), 1, true);
}
}
或: 1 3 4 10 11 21 22 36 37 55 56
问你后面的数是什么, 这种Case还是有的。
======================================================================不用程序,也不难。(1):
1 2 6 7 15 16 28 29 45 46 66
(1 2) (6 7)(15 16)(28 29)(45 46)(66 ?)......
答案:67(2):
1 (3 4) (10 11) (21 22) (36 37) (55 56) (x y)......
\ / \ / \ / \ / \ / \ /
+2 +6 +10 +14 +18 +22?
答案: x=78, y=79
或: 1 3 4 10 11 21 22 36 37 55 56
问你后面的数是什么, 这种Case还是有的。
======================================================================不用程序,也不难。(1):
1 2 6 7 15 16 28 29 45 46 66
(1 2) (6 7)(15 16)(28 29)(45 46)(66 ?)......
答案:67(2):
1 (3 4) (10 11) (21 22) (36 37) (55 56) (x y)......
\ / \ / \ / \ / \ / \ /
+2 +6 +10 +14 +18 +22?
答案: x=78, y=79
public static void main(String[] args) {
SnakeMatrix sm = new SnakeMatrix(11);
// sm.outputResult(sm.getMatrix());
sm.outputResult(sm.getMatrix(), 3, true);
}
6 8 13 19 24 34 39 53 58 75 77 呢?你的规律就不太好找了!
public class TestRec{
public static int[][] createRec(int n){
int[][] a = new int[n][n];
int m=1;
int b=add(n)+1;
for(int k=0;k<=2*n-2;k++){
if(k<n){
for(int i=0,j=k;i<=k;i++,j--,m++){
if(k%2==0){
a[j][i]=m;
}
if(k%2==1){
a[i][j]=m;
}
}
}
if(k>=n){
for(int i=k-n+1,j=n-1;i<n;i++,j--,b++){
if(k%2==0){
a[i][j]=b;
}
if(k%2==1){
a[j][i]=b;
}
}
}
}
return a;
}
public static int add(int n){
int c=0;
for(int i=1;i<=n;i++){
c+=i;
}
return c;
}
public static String printArray(int[][] a){
String result = "";
for(int i=0;i<a.length;i++){
for(int j=0;j<a[i].length;j++){
if(a[i][j]<=9){
result += " " + a[i][j] + " ";
}else{
result += a[i][j] + " ";
}
}
result += "\n";
}
return result;
}
public static void main(String[] args){
System.out.println(printArray(createRec(4)));
}
}
if(a[i][j]<=9){
result += " " + a[i][j] + " ";
}else{
result += a[i][j] + " ";
}
}我把这几个函数都设成了static型,为的是在main中调用方便,在main中的输出语句createRec(4)中的4可以改成任意维数关于这个算法的效率我就不太好说了,数据结构关于效率这块学得不好,不过在我机器上超过100*100的输出就会变得很慢还有就是我觉得我写的程序更具有面向对象特性和通用性,所有操作都封装在方法里面了