都说csdn高手多,特来此寻求一算法的实现 本帖最后由 Wuaner 于 2009-08-11 13:13:31 编辑 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 12 13 14 15 0 0 1 0 8 9 10 11 X 1 0 0 0 4 5 6 7 0 1 0 0 0 1 2 3 0 0 0 1关键是得出后面那个matrix,应该也不是很复杂 import java.util.*;public class Test { public static void main(String[] args) { int[][] result1=getMatrix(4,4); int[][] result2=getMatrix(5,5); System.out.println("4X4"); for(int[] i:result2){ System.out.println(Arrays.toString(i)); } System.out.println("5X5"); for(int[] i:result2){ System.out.println(Arrays.toString(i)); } } public static int[][] getMatrix(int rowNum,int columnNum){ int[][] result=new int[rowNum][columnNum]; int num=0; int start=0; if((columnNum&1)==1){ start=columnNum/2; }else{ start=columnNum/2-1; } for(int i=rowNum-1;i>=0;i--){ int index=start; int snf=1; for(int j=0;j<columnNum;j++){ result[i][index]=num++; index=index+(j+1)*snf; snf*=-1; } } return result; } F:\java>java Test4X4[24, 22, 20, 21, 23][19, 17, 15, 16, 18][14, 12, 10, 11, 13][9, 7, 5, 6, 8][4, 2, 0, 1, 3]5X5[24, 22, 20, 21, 23][19, 17, 15, 16, 18][14, 12, 10, 11, 13][9, 7, 5, 6, 8][4, 2, 0, 1, 3] 加上下面的方法 ,用它来打印结果,结果就好看一点了 public static void printMatrix(int[][] result){ for(int i=0;i<result.length;i++){ for(int j=0;j<result[i].length;j++){ System.out.printf("%5d",result[i][j]); } System.out.println(); } } F:\java>java Test4X4 14 12 13 15 10 8 9 11 6 4 5 7 2 0 1 35X5 24 22 20 21 23 19 17 15 16 18 14 12 10 11 13 9 7 5 6 8 4 2 0 1 3 public void doCR(int c,int r){ if(c%2==0){//偶数列 for(int i=r;i>0;i--){ int j1=c*i;int j2=c*(i-1);int j3=j1-2; while(j3>j2){ System.out.print(j3+" "); j3=j3-2; } j3=j2; System.out.print(j3+" "); j3++; while(j3<j1){ System.out.print(j3+" "); j3=j3+2; } System.out.println(""); } } else{//奇数列 for(int i=r;i>0;i--){ int j1=c*i;int j2=c*(i-1);int j3=j1-2; while(j3>j2){ System.out.print(j3+" "); j3=j3-2; } j3=j2; while(j3<j1){ System.out.print(j3+" "); j3=j3+2; } System.out.println(""); } } } 没有看仔细奇数的情况,下面的代码应该没有问题:public class Test { public static void main(String[] args) { int[][] result1=getMatrix(4,4); int[][] result2=getMatrix(5,5); System.out.println("4X4"); printMatrix(result1); System.out.println("5X5"); printMatrix(result2); } public static int[][] getMatrix(int rowNum,int columnNum){ int[][] result=new int[rowNum][columnNum]; int num=0; int start=0; int snf=0; if((columnNum&1)==1){ start=columnNum/2; }else{ start=columnNum/2-1; } for(int i=rowNum-1;i>=0;i--){ int index=start; if((columnNum&1)==1){ snf=-1; }else{ snf=1; } for(int j=0;j<columnNum;j++){ result[i][index]=num++; index=index+(j+1)*snf; snf*=-1; } } return result; } public static void printMatrix(int[][] result){ for(int i=0;i<result.length;i++){ for(int j=0;j<result[i].length;j++){ System.out.printf("%5d",result[i][j]); } System.out.println(); } } }F:\java>java Test4X4 14 12 13 15 10 8 9 11 6 4 5 7 2 0 1 35X5 23 21 20 22 24 18 16 15 17 19 13 11 10 12 14 8 6 5 7 9 3 1 0 2 4 public class WabbleMatrix { private int[][] data; public WabbleMatrix(int rows, int cols) { this.data = new int[rows][cols]; build(rows, cols); } // 构造数组内容 private void build(int rows, int cols) { int max = rows * cols - 1; // 要填入的第一个数字 int row_pointer = 0; // 当前行 int[] col_pointers = {-1, cols}; // 当前列(两个指针) int currentpointer = 0; // 当前使用的列指针(0 或 1) while (max >= 0) { currentpointer = getCurrentPointer(col_pointers, currentpointer); data[row_pointer][col_pointers[currentpointer]] = max; max--; // 如果两个列指针相邻就移到下一行,并重新摆正列指针位置 if (touched(col_pointers)) { row_pointer++; col_pointers = new int[]{-1, cols}; currentpointer = 0; } } } // 在两个列指针之间切换,并移动列指针 private int getCurrentPointer(int[] pointers, int currentpointer) { currentpointer = (currentpointer + 1) % pointers.length; if (currentpointer == 0) { pointers[currentpointer] = pointers[currentpointer] + 1; } else { pointers[currentpointer] = pointers[currentpointer] - 1; } return currentpointer; } // 判断两个列指针是否相邻 private boolean touched(int[] pointers) { return pointers[0] + 1 == pointers[1]; } // 格式化输出 public String toString() { String str = ""; for (int[] rows : data) { for (int item : rows) { str += String.format("%5d", item); } str += "\n"; } return str; } // 程序入口 public static void main(String[] args) { WabbleMatrix matrix = new WabbleMatrix(4, 5); System.out.println(matrix); System.out.println(); matrix = new WabbleMatrix(4, 4); System.out.println(matrix); }} 哦,那个简单啊:import java.util.*;public class Test { public static void main(String[] args) { int[] result1=getList(4,5); int[] result2=getList(4,4); System.out.println(Arrays.toString(result1)); System.out.println(Arrays.toString(result2)); } public static int[][] getMatrix(int rowNum,int columnNum){ int[][] result=new int[rowNum][columnNum]; int num=0; int start=0; int snf=0; if((columnNum&1)==1){ start=columnNum/2; }else{ start=columnNum/2-1; } for(int i=rowNum-1;i>=0;i--){ int index=start; if((columnNum&1)==1){ snf=-1; }else{ snf=1; } for(int j=0;j<columnNum;j++){ result[i][index]=num++; index=index+(j+1)*snf; snf*=-1; } } return result; } public static int[] getList(int rowNum,int columnNum){ int[][] result=getMatrix( rowNum,columnNum); int [] resultList=new int[rowNum*columnNum]; int index=0; for(int i=0;i<result.length;i++){ for(int j=0;j<result[i].length;j++){ resultList[index++]=result[i][j]; } } return resultList; } public static void printMatrix(int[][] result){ for(int i=0;i<result.length;i++){ for(int j=0;j<result[i].length;j++){ System.out.printf("%5d",result[i][j]); } System.out.println(); } } }F:\java>java Test[18, 16, 15, 17, 19, 13, 11, 10, 12, 14, 8, 6, 5, 7, 9, 3, 1, 0, 2, 4][14, 12, 13, 15, 10, 8, 9, 11, 6, 4, 5, 7, 2, 0, 1, 3] bigbug你可真有耐心,这又是什么问题啊?还以为由多难呢 嘿嘿毛毛虫最近果然活跃public class Test { public static void main(String[] args) { int[][] result1=getMatrix(4,4); int[][] result2=getMatrix(5,5); System.out.println("4X4"); printMatrix(result1); System.out.println("5X5"); printMatrix(result2); } public static int[][] getMatrix(int rowNum,int columnNum){ int[][] result=new int[rowNum][columnNum]; int num=0; int start=0; int snf=0; if((columnNum&1)==1){ start=columnNum/2; }else{ start=columnNum/2-1; } for(int i=rowNum-1;i>=0;i--){ int index=start; if((columnNum&1)==1){ snf=-1; }else{ snf=1; } for(int j=0;j<columnNum;j++){ result[i][index]=num++; index=index+(j+1)*snf; snf*=-1; } } return result; } public static void printMatrix(int[][] result){ for(int i=0;i<result.length;i++){ for(int j=0;j<result[i].length;j++){ System.out.printf("%5d",result[i][j]); } System.out.println(); } } } 太感谢大家了,尤其是大虫兄,用他的热心让广大坛友感受到了csdn的温暖!千言万语汇成一句话:谢谢! 分不多,大家回答问题的积极使我不知道该怎么个分配这些分了大虫兄的热情是大家有目共睹的,我最终采用的就是大虫兄的办法;此外还有两位为我这个问题写了code做回复的,也一并散分感谢! 遍历容器的时候,用Iterator还是for循环,哪个效率更高? JAVA中抽取不同的随机数 急~~~请高手帮忙啊 题目太长问题内详~~ 无法找到类型"JFrame","JTable"和"JCheckBox" httpclient高手进来看一下吧.谢谢你们了 求助:[Microsoft][ODBC Microsoft Access Driver] 查询值的数目与目标字段中的数目不同。 Java连接MYSQL的问题 jive_2里大容量的字段存不进去? 逻辑的困惑?? 请问哪里可以查到手机编程的资料? 怎么用java读取网页上的数据,比如大盘数据 java程序发布的问题
8 9 10 11 X 1 0 0 0
4 5 6 7 0 1 0 0
0 1 2 3 0 0 0 1关键是得出后面那个matrix,应该也不是很复杂
public class Test {
public static void main(String[] args) {
int[][] result1=getMatrix(4,4);
int[][] result2=getMatrix(5,5);
System.out.println("4X4");
for(int[] i:result2){
System.out.println(Arrays.toString(i));
}
System.out.println("5X5");
for(int[] i:result2){
System.out.println(Arrays.toString(i));
}
}
public static int[][] getMatrix(int rowNum,int columnNum){
int[][] result=new int[rowNum][columnNum];
int num=0;
int start=0;
if((columnNum&1)==1){
start=columnNum/2;
}else{
start=columnNum/2-1;
}
for(int i=rowNum-1;i>=0;i--){
int index=start;
int snf=1;
for(int j=0;j<columnNum;j++){
result[i][index]=num++;
index=index+(j+1)*snf;
snf*=-1;
}
}
return result;
}
F:\java>java Test
4X4
[24, 22, 20, 21, 23]
[19, 17, 15, 16, 18]
[14, 12, 10, 11, 13]
[9, 7, 5, 6, 8]
[4, 2, 0, 1, 3]
5X5
[24, 22, 20, 21, 23]
[19, 17, 15, 16, 18]
[14, 12, 10, 11, 13]
[9, 7, 5, 6, 8]
[4, 2, 0, 1, 3]
for(int i=0;i<result.length;i++){
for(int j=0;j<result[i].length;j++){
System.out.printf("%5d",result[i][j]);
}
System.out.println();
}
}
4X4
14 12 13 15
10 8 9 11
6 4 5 7
2 0 1 3
5X5
24 22 20 21 23
19 17 15 16 18
14 12 10 11 13
9 7 5 6 8
4 2 0 1 3
if(c%2==0){//偶数列
for(int i=r;i>0;i--){
int j1=c*i;int j2=c*(i-1);int j3=j1-2;
while(j3>j2){
System.out.print(j3+" ");
j3=j3-2;
}
j3=j2;
System.out.print(j3+" ");
j3++;
while(j3<j1){
System.out.print(j3+" ");
j3=j3+2;
}
System.out.println("");
}
}
else{//奇数列
for(int i=r;i>0;i--){
int j1=c*i;int j2=c*(i-1);int j3=j1-2;
while(j3>j2){
System.out.print(j3+" ");
j3=j3-2;
}
j3=j2;
while(j3<j1){
System.out.print(j3+" ");
j3=j3+2;
}
System.out.println("");
}
}
}
public static void main(String[] args) {
int[][] result1=getMatrix(4,4);
int[][] result2=getMatrix(5,5);
System.out.println("4X4");
printMatrix(result1);
System.out.println("5X5");
printMatrix(result2);
}
public static int[][] getMatrix(int rowNum,int columnNum){
int[][] result=new int[rowNum][columnNum];
int num=0;
int start=0;
int snf=0;
if((columnNum&1)==1){
start=columnNum/2;
}else{
start=columnNum/2-1;
}
for(int i=rowNum-1;i>=0;i--){
int index=start;
if((columnNum&1)==1){
snf=-1;
}else{
snf=1;
}
for(int j=0;j<columnNum;j++){
result[i][index]=num++;
index=index+(j+1)*snf;
snf*=-1;
}
}
return result;
}
public static void printMatrix(int[][] result){
for(int i=0;i<result.length;i++){
for(int j=0;j<result[i].length;j++){
System.out.printf("%5d",result[i][j]);
}
System.out.println();
}
}
}F:\java>java Test
4X4
14 12 13 15
10 8 9 11
6 4 5 7
2 0 1 3
5X5
23 21 20 22 24
18 16 15 17 19
13 11 10 12 14
8 6 5 7 9
3 1 0 2 4
this.data = new int[rows][cols];
build(rows, cols);
} // 构造数组内容
private void build(int rows, int cols) {
int max = rows * cols - 1; // 要填入的第一个数字
int row_pointer = 0; // 当前行
int[] col_pointers = {-1, cols}; // 当前列(两个指针)
int currentpointer = 0; // 当前使用的列指针(0 或 1) while (max >= 0) {
currentpointer = getCurrentPointer(col_pointers, currentpointer);
data[row_pointer][col_pointers[currentpointer]] = max;
max--; // 如果两个列指针相邻就移到下一行,并重新摆正列指针位置
if (touched(col_pointers)) {
row_pointer++;
col_pointers = new int[]{-1, cols};
currentpointer = 0;
}
}
} // 在两个列指针之间切换,并移动列指针
private int getCurrentPointer(int[] pointers, int currentpointer) {
currentpointer = (currentpointer + 1) % pointers.length;
if (currentpointer == 0) {
pointers[currentpointer] = pointers[currentpointer] + 1;
} else {
pointers[currentpointer] = pointers[currentpointer] - 1;
}
return currentpointer;
} // 判断两个列指针是否相邻
private boolean touched(int[] pointers) {
return pointers[0] + 1 == pointers[1];
} // 格式化输出
public String toString() {
String str = "";
for (int[] rows : data) {
for (int item : rows) {
str += String.format("%5d", item);
}
str += "\n";
}
return str;
} // 程序入口
public static void main(String[] args) {
WabbleMatrix matrix = new WabbleMatrix(4, 5);
System.out.println(matrix);
System.out.println(); matrix = new WabbleMatrix(4, 4);
System.out.println(matrix);
}
}
public class Test {
public static void main(String[] args) {
int[] result1=getList(4,5);
int[] result2=getList(4,4);
System.out.println(Arrays.toString(result1));
System.out.println(Arrays.toString(result2));
}
public static int[][] getMatrix(int rowNum,int columnNum){
int[][] result=new int[rowNum][columnNum];
int num=0;
int start=0;
int snf=0;
if((columnNum&1)==1){
start=columnNum/2;
}else{
start=columnNum/2-1;
}
for(int i=rowNum-1;i>=0;i--){
int index=start;
if((columnNum&1)==1){
snf=-1;
}else{
snf=1;
}
for(int j=0;j<columnNum;j++){
result[i][index]=num++;
index=index+(j+1)*snf;
snf*=-1;
}
}
return result;
}
public static int[] getList(int rowNum,int columnNum){
int[][] result=getMatrix( rowNum,columnNum);
int [] resultList=new int[rowNum*columnNum];
int index=0;
for(int i=0;i<result.length;i++){
for(int j=0;j<result[i].length;j++){
resultList[index++]=result[i][j];
}
}
return resultList;
}
public static void printMatrix(int[][] result){
for(int i=0;i<result.length;i++){
for(int j=0;j<result[i].length;j++){
System.out.printf("%5d",result[i][j]);
}
System.out.println();
}
}
}
F:\java>java Test
[18, 16, 15, 17, 19, 13, 11, 10, 12, 14, 8, 6, 5, 7, 9, 3, 1, 0, 2, 4]
[14, 12, 13, 15, 10, 8, 9, 11, 6, 4, 5, 7, 2, 0, 1, 3]
public static void main(String[] args) {
int[][] result1=getMatrix(4,4);
int[][] result2=getMatrix(5,5);
System.out.println("4X4");
printMatrix(result1);
System.out.println("5X5");
printMatrix(result2);
}
public static int[][] getMatrix(int rowNum,int columnNum){
int[][] result=new int[rowNum][columnNum];
int num=0;
int start=0;
int snf=0;
if((columnNum&1)==1){
start=columnNum/2;
}else{
start=columnNum/2-1;
}
for(int i=rowNum-1;i>=0;i--){
int index=start;
if((columnNum&1)==1){
snf=-1;
}else{
snf=1;
}
for(int j=0;j<columnNum;j++){
result[i][index]=num++;
index=index+(j+1)*snf;
snf*=-1;
}
}
return result;
}
public static void printMatrix(int[][] result){
for(int i=0;i<result.length;i++){
for(int j=0;j<result[i].length;j++){
System.out.printf("%5d",result[i][j]);
}
System.out.println();
}
}
}