日期:2014-05-20  浏览次数:20682 次

如何得到不重合的指定范围的二维数组
现在遇到一个问题:
    需要在(0,n)之间得到一个二维的整数数组,要求:每行的值不一样,并且在数组中得到所有的行,列数为k,k <=n,怎么实现?
    比如说;
    (0,5),那么得到的数值应该在1,4之间,列数为2,这样的数组为
    1     2
    1     3
    1     4
    2     3
    2     4
    3     4
    总共这么6种情况,利用Java怎么实现?


------解决方案--------------------
public int[][] get(int m, int n)
{
if (m > = n - 2) return null;
int count = 0;
int[][] mn = new int[(n-m-2)*(n-m-1)/2][2];
for (int i = m + 1; i < n; i++) {
for (int j = i + 1; j < n; j++) {
mn[count][0] = i;
mn[count++][1] = j;
}
}
return mn;
}
------解决方案--------------------
public class Test {
private int[] temp;
private int[][] result; //保存结果
private int n, k;
private int row_count; //行标

public int[][] get(int n, int k)
{
temp = new int[k];
int rows = c(n-1, k); //计算行数,如果太大可能OutOfMemory。如有需要,可用其他方式保存数据,如输出到文件
result = new int[rows][k];
this.n = n - 1;
this.k = k;
search(0); //生成结果

return result;
}

private void search(int start)
{
if(start == k)
{
for(int i = 0; i < k; i++)
result[row_count][i] = temp[i];
row_count++;
return;
}

for(int j = (start == 0 ? 0 : temp[start-1]); j < n; j++)
{
temp[start] = j + 1;
search(start + 1);
}
}

private int c(long a, long b)
{
long r1 = 1, r2 = 1;
while (b > 0) {
r1 *= a--;
r2 *= b--;
}

return (int)(r1 / r2);
}

public static void main(String[] args){
int[][] result = new Test().get(10, 5);

//打印输出
for (int i = 0; i < result.length; i++) {
for (int j = 0; j < result[i].length; j++)
System.out.print(result[i][j]+ "\t ");
System.out.println();
}

}
}