算法高手请进,求一算法的代码

nattystyle 2007-09-22 08:42:50
一个3×3的二维数组,里面初始几个位置有1-9之间随机的一个数字,例如:

1 空 空
空 4 空
8 空 9

现在要求打印出1-9把这9格填满的所有方案

求代码
...全文
229 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
fantasymars 2007-09-23
  • 打赏
  • 举报
回复
阿宝牛人
wuy13862574600 2007-09-23
  • 打赏
  • 举报
回复
楼上的牛!!

复制保存下来研究研究,呵呵
aniude 2007-09-23
  • 打赏
  • 举报
回复
简单地说,写个递归的算法就OK了,前提是我要知道矩阵中缺哪几个数是需要填充的:)
qybao 2007-09-22
  • 打赏
  • 举报
回复
排列组合的问题,没事就写一个玩玩吧,关键是parade方法,从一个数组中抽出n个元素进行全排列

import java.io.*;
import java.util.Vector;

public class Game {
public static void main(String[] args) {
new Game().solve();

// test play
// new Game().play();

// test parade
// Game game = new Game();
// for (int i=1; i<game.size-1; i++) {
// System.out.println("--------elements: " + (i+1) + "--------");
// game.printParadeResult(game.parade(game.all, i));
// }
}

int[] all = {1, 2, 3, 4, 5, 6, 7, 8, 9};
int[] taken, remain;
int size = all.length;
int width = (int)Math.sqrt(size);

public void solve() {
taken = new int[] {1, 4, 8, 9};
remain = new int[] {2, 3, 5, 6, 7};
int[][] matrix = new int[width][width];
matrix[0][0] = taken[0];
matrix[1][1] = taken[1];
matrix[2][0] = taken[2];
matrix[2][2] = taken[3];

printMatrix(matrix);

int[][] result = parade(remain, remain.length);
printMatrixResult(matrix, result);
}


public void play() {
try {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String s;
int n = 0;
while (true) {
System.out.print("Input number of initial elements: ");
s = br.readLine();
try {
n = Integer.parseInt(s);
if (n<0 || n>all.length) {
throw new Exception("please input a number between 0 and 9.");
}
} catch (Exception e) {
System.out.println(e.getMessage());
System.out.println("Input error, press enter key to try again or type [go] to exit.");
s = br.readLine();
if (s != null && "go".equals(s)) {
break;
}
continue;
}

int[][] matrix = init(n);
printMatrix(matrix);

int[][] result = parade(remain, remain.length);
printMatrixResult(matrix, result);

System.out.println("press enter key to play again or type [go] to exit.");
s = br.readLine();
if (s != null && "go".equals(s)) {
break;
}
}

System.out.println("bye...");

} catch (Throwable e) {
e.printStackTrace();
}
}

private int[][] init(int n) {
int[][] matrix = new int[width][width];
for (int i=0; i<width; i++) {
for (int j=0; j<width; j++) {
matrix[i][j] = 0;
}
}

int index;
taken = new int[n];
remain = new int[all.length-n];
StringBuffer sb = new StringBuffer(",");
for (int i=0; ; ) {
index = ((int)(Math.random()*100)) % all.length;
if (sb.indexOf(","+index+",") >= 0) {
continue;
}
sb.append(index).append(",");
taken[i++] = all[index];
if (i==n) {
break;
}
}

for (int i=0, k=0; i<size; i++) {
if (sb.indexOf(","+i+",") >= 0) {
matrix[i/width][i%width] = all[i];
} else {
remain[k++] = all[i];
}
}

printTaken();
printRemain();

return matrix;
}

private void printTaken() {
System.out.println("--------taken--------");
for (int i=0; i<taken.length; i++) {
System.out.print(taken[i] + " ");
}
System.out.println("");
}

private void printRemain() {
System.out.println("--------remain--------");
for (int i=0; i<remain.length; i++) {
System.out.print(remain[i] + " ");
}
System.out.println("");
}

private void printMatrix(int[][] matrix) {
System.out.println("--------init--------");
for (int i=0; i<width; i++) {
for (int j=0; j<width-1; j++) {
System.out.print((matrix[i][j]>0?matrix[i][j]+" ":"* "));
}
System.out.println((matrix[i][width-1]>0?matrix[i][width-1]+"":"*"));
}
}

private void printMatrixResult(int[][] matrix, int[][] result) {
for (int i=0, k=0; i<result.length; i++) {
System.out.println("--------result " + (i+1) + "--------");
k = 0;
for (int j=0; j<size; j++) {
if (matrix[j/width][j%width] == 0) {
System.out.print(result[i][k++] + " ");
} else {
System.out.print(matrix[j/width][j%width] + " ");
}
if ((j+1)%width == 0) {
System.out.println("");
}
}
}
}

private void printParadeResult(int[][] result) {
for (int i=0; i<result.length; i++) {
System.out.println("--------result " + (i+1) + "--------");
for (int j=0; j<result[i].length; j++) {
System.out.print(result[i][j] + ", ");
}
System.out.println(result[i][result[i].length-1] + "");
}
}

public int[][] parade(int[] src, int n) {
if (src.length < n) {
return new int[0][0];
}

if (n == 1) {
int[][] result = new int[src.length][1];
for (int i=0; i<src.length; i++) {
result[i][0] = src[i];
}
return result;
}

int[] sub = new int[src.length-1];
Vector v = new Vector();
for (int i=0; i<src.length; i++) {
for (int j=0, k=0; j<src.length; j++) {
if (src[i] != src[j]) {
sub[k++] = src[j];
}
}
int[][] tmp = parade(sub, n-1);
for (int j=0; j<tmp.length; j++) {
int[] tmp2 = new int[n];
tmp2[0] = src[i];
System.arraycopy(tmp[j], 0, tmp2, 1, tmp[j].length);
v.add(tmp2);
}
}

int[][] result = new int[v.size()][n];
System.arraycopy(v.toArray(), 0, result, 0, v.size());

return result;
}
}

IhaveGotYou 2007-09-22
  • 打赏
  • 举报
回复
取{ 2, 3, 5, 6, 7 }所有的排列组合就可以了。

填充方案:

int a[] = { 2, 3, 5, 6, 7 };
int len = a.length;
for (int i = 0; i < len; i++)
for (int j = 0; j < len; j++) {
if (j == i)
continue;
for (int k = 0; k < len; k++) {
if (k == i || k == j)
continue;
for (int l = 0; l < len; l++) {
if (l == i || l == j || l == k)
continue;
for(int m=0;m<len;m++){
if(m==i || m==j || m==k || m==l)
continue;
System.out.println("1,"+a[i] + "," + a[j] + "," + a[k] + ",4,"
+ a[l]+",8,"+a[m]+",9");
}
}
}
}

}
shan1119 2007-09-22
  • 打赏
  • 举报
回复
这个就是求几个数的全排列啊,不难吧

62,623

社区成员

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

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