求一个我不会的数学算法,请帮忙,多谢!!! 本帖最后由 yunyan2140 于 2010-10-24 21:15:06 编辑 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 import java.util.Arrays;public class Pgrid { boolean[] p = new boolean[50]; int[][] m = new int[5][5]; boolean[] used = new boolean[26]; Pgrid() { p[2] = p[3] = p[5] = p[7] = p[11] = p[13] = true; p[17] = p[19] = p[23] = p[29] = p[31] = p[37] = true; p[41] = p[43] = p[47] = true; } boolean isOk(int i, int j, int x) { if(used[x]) return false; if(i>0 && !p[x+m[i-1][j]]) return false; if(j>0 && !p[x+m[i][j-1]]) return false; return true; } void fill(int index) { if(index==25) { for(int i=0; i<5; i++) System.out.println(Arrays.toString(m[i])); System.out.println("============"); System.exit(0); // or return; if need all results } int i = index/5; int j = index%5; for(int x=1; x<=25; x++) { if(isOk(i, j, x)) { m[i][j] = x; used[x] = true; fill(index+1); used[x] = false; } } } public static void main(String[] args) { new Pgrid().fill(0); }}结果[1, 2, 3, 4, 7][6, 5, 8, 15, 22][25, 18, 23, 14, 9][16, 13, 24, 17, 20][21, 10, 19, 12, 11] 哦,少看了个条件,加上就是。把其中的isOk函数改成这样: boolean isOk(int i, int j, int x) { if(used[x]) return false; if(i>0) { int sum = x+m[i-1][j]; if(sum <= 11 || sum>=41 || !p[sum]) return false; } if(j>0) { int sum = x+m[i][j-1]; if(sum <= 11 || sum>=41 || !p[sum]) return false; } return true; }不过加上之后无解。 把41改成45就有解了。 恩 楼上的8错啊哈哈不过不用改isok改p数组就行了 貌似效率会好点啊 多谢groovy2007呵呵 你没认真看条件 是大于11小于41 不是大于等于和小于等于大牛啊 再次说声谢谢 在使用java多线程时遇到了问题,困惑 环境变量 需要JAVA书籍和简单代码的初学者进 通过Socket接收来的数据如何写入硬盘? 那刚走出校门的毕业生最起码会写什么东东啊 关于获取Access数据库主键信息出现的问题,请教 程序员好做吗? 一个初学者的问题!! 菜鸟求教!大神请进,位运算的问题 散分:Jbuilder6开发数据库应用请问你们都用什么数据库? 免费的数据库有那些? jnode怎么用啊,比如创建一个文件的命令 java播放声音的问题!~
import java.util.Arrays;public class Pgrid {
boolean[] p = new boolean[50];
int[][] m = new int[5][5];
boolean[] used = new boolean[26];
Pgrid() {
p[2] = p[3] = p[5] = p[7] = p[11] = p[13] = true;
p[17] = p[19] = p[23] = p[29] = p[31] = p[37] = true;
p[41] = p[43] = p[47] = true;
}
boolean isOk(int i, int j, int x) {
if(used[x]) return false;
if(i>0 && !p[x+m[i-1][j]]) return false;
if(j>0 && !p[x+m[i][j-1]]) return false;
return true;
}
void fill(int index) {
if(index==25) {
for(int i=0; i<5; i++)
System.out.println(Arrays.toString(m[i]));
System.out.println("============");
System.exit(0); // or return; if need all results
}
int i = index/5;
int j = index%5;
for(int x=1; x<=25; x++) {
if(isOk(i, j, x)) {
m[i][j] = x;
used[x] = true;
fill(index+1);
used[x] = false;
}
}
} public static void main(String[] args) {
new Pgrid().fill(0);
}}结果
[1, 2, 3, 4, 7]
[6, 5, 8, 15, 22]
[25, 18, 23, 14, 9]
[16, 13, 24, 17, 20]
[21, 10, 19, 12, 11]
把其中的isOk函数改成这样: boolean isOk(int i, int j, int x) {
if(used[x]) return false;
if(i>0) {
int sum = x+m[i-1][j];
if(sum <= 11 || sum>=41 || !p[sum]) return false;
}
if(j>0) {
int sum = x+m[i][j-1];
if(sum <= 11 || sum>=41 || !p[sum]) return false;
}
return true;
}
不过加上之后无解。 把41改成45就有解了。
不过不用改isok改p数组就行了
貌似效率会好点啊
呵呵 你没认真看条件 是大于11小于41 不是大于等于和小于等于
大牛啊 再次说声谢谢