求一个我不会的数学算法,请帮忙,多谢!!!

浩风2140 2010-10-24 09:14:16
使一到二十五填入一个五乘五方格,不能出现重复的数字,使每两个相邻的数的和为质数,切大于十一小于四十一.
...全文
97 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
浩风2140 2010-10-25
  • 打赏
  • 举报
回复
多谢groovy2007
呵呵 你没认真看条件 是大于11小于41 不是大于等于和小于等于
大牛啊 再次说声谢谢
浩风2140 2010-10-25
  • 打赏
  • 举报
回复
多谢大家,我水平低,让我看看先啊..谢谢
zqfddqr 2010-10-24
  • 打赏
  • 举报
回复
恩 楼上的8错啊哈哈
不过不用改isok改p数组就行了
貌似效率会好点啊
groovy2007 2010-10-24
  • 打赏
  • 举报
回复
哦,少看了个条件,加上就是。
把其中的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就有解了。
zqfddqr 2010-10-24
  • 打赏
  • 举报
回复
楼上的这个相邻也不大于了11


[1, 2, 3, 4, 7]
[6, 5, 8, 15, 22]
groovy2007 2010-10-24
  • 打赏
  • 举报
回复

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]
zqfddqr 2010-10-24
  • 打赏
  • 举报
回复
恩写过别的类似的东西你这个复杂的说呵呵
groovy2007 2010-10-24
  • 打赏
  • 举报
回复
怎么算相邻?

62,614

社区成员

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

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