| 查看: 434 | 回复: 1 | |||
wangcl8659金虫 (小有名气)
|
[交流]
【求助】食人魔过程程序
|
|
食人魔过河问题 (1)三个传教士、三个食人魔和一条船在河的左岸 (2)传教士和食人魔都能撑船,船的最大准载量为2;而且当食人魔比传教士多时,食人魔会伤害传教士 (3)寻找一种渡河方案 最好是Java语言,其他也可以。 |
» 猜你喜欢
假如你的研究生提出不合理要求
已经有8人回复
萌生出自己或许不适合搞科研的想法,现在跑or等等看?
已经有4人回复
Materials Today Chemistry审稿周期
已经有4人回复
参与限项
已经有3人回复
实验室接单子
已经有4人回复
全日制(定向)博士
已经有4人回复
对氯苯硼酸纯化
已经有3人回复
求助:我三月中下旬出站,青基依托单位怎么办?
已经有12人回复
所感
已经有4人回复
要不要辞职读博?
已经有7人回复
wangcl8659
金虫 (小有名气)
- 应助: 0 (幼儿园)
- 金币: 1830.5
- 散金: 10
- 红花: 1
- 帖子: 61
- 在线: 39小时
- 虫号: 711045
- 注册: 2009-02-28
- 专业: 知识管理
余泽成:本版不鼓励未经思考的作业求助!退还金币,关闭此帖! 2010-08-15 16:14:01
|
这是网上找到的程序。 鉴于本人是纯管理类学生,不懂编程,但是由于作业要求,希望关注者帮忙调试,或者提供步骤,怎么把这个程序放到JAVA中,并设置页面 启发式函数是(numOfMiss + numOfCann + boatAt - 1) / (capacity - 1); /** * 启发式搜索方案 */ private void solveInAStar() { System.out.println("现在使用启发式搜索方案" ;Transport[][][] pre = new Transport[numOfMiss + 1][numOfCann + 1][2]; long begin = initiation(); Queue queue.add(new Status(numOfMiss, numOfCann, 0, -1, 0 + calF(numOfMiss, numOfCann, 0))); pre[numOfMiss][numOfCann][0] = new Transport(-1, -1, -1); dp[numOfMiss][numOfCann][0] = 0; boolean solution = false; while (!queue.isEmpty()) { Status now = queue.remove(); int leftMiss = now.leftMiss; int leftCann = now.leftCann; int boatAt = now.boatAt; // System.out.printf("%d %d %d %d\n", leftMiss, leftCann, boatAt, // now.cost); if (leftCann == 0 && leftMiss == 0) { int idx = 0; while (true) { Transport t = pre[leftMiss][leftCann][boatAt]; if (t.a == -1) break; steps[idx++] = t; if (t.boatAt == 0) { leftMiss += t.a; leftCann += t.b; } else { leftMiss -= t.a; leftCann -= t.b; } boatAt = 1 - boatAt; } for (int i = 0, j = idx - 1; i < j; ++i, --j) { Transport tmp = steps; steps = steps[j]; steps[j] = tmp; } OutputAnswer(idx); solution = true; break; } int i, j; if (boatAt == 0) { for (i = 0; i <= leftMiss && i <= capacity; ++i) { for (j = 0; j <= leftCann && i + j <= capacity; ++j) { if (i + j != 0) { if (checkValidSmaller(leftMiss - i, leftCann - j, 1 - boatAt, now.cost + 1)) { queue.add(new Status(leftMiss - i, leftCann - j, 1 - boatAt, -1, now.cost + 1 + calF(leftMiss - i, leftCann - j, 1 - boatAt))); dp[leftMiss - i][leftCann - j][1 - boatAt] = now.cost + 1; pre[leftMiss - i][leftCann - j][1 - boatAt] = new Transport( i, j, boatAt); } } } } } else { int rightMiss = numOfMiss - leftMiss; int rightCann = numOfCann - leftCann; for (i = 0; i <= rightMiss && i <= capacity; ++i) { for (j = 0; j <= rightCann && i + j <= capacity; ++j) { if (i + j != 0) { if (checkValidSmaller(leftMiss + i, leftCann + j, 1 - boatAt, now.cost + 1)) { queue.add(new Status(leftMiss + i, leftCann + j, 1 - boatAt, -1, now.cost + 1 + calF(leftMiss + i, leftCann + j, 1 - boatAt))); dp[leftMiss + i][leftCann + j][1 - boatAt] = now.cost + 1; pre[leftMiss + i][leftCann + j][1 - boatAt] = new Transport( i, j, boatAt); } } } } } } if (!solution) System.out.println("不存在解!" ;queue.clear(); System.out.println("Time elapsed: " + (System.currentTimeMillis() - begin) + " minisecs.\n" ;} private int calF(int numOfMiss, int numOfCann, int boatAt) { return (numOfMiss + numOfCann + boatAt - 1) / (capacity - 1); } |
2楼2010-08-15 13:44:38












回复此楼
;