锁定老帖子 主题:EMC笔试题(最后一道编程题)
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2010-12-01
没有看懂题目。 为何没有两个小球碰撞情况。 此题可否如此理解,三个小球只要横坐标或纵坐标相同,此题误解。或是两个小球碰撞后横坐标或纵坐标相邻此题无解 其他情况均为有解。 |
|
返回顶楼 | |
发表时间:2010-12-01
只想到穷举回溯。
|
|
返回顶楼 | |
发表时间:2010-12-01
好像比较难,谁给出一种解法啊? |
|
返回顶楼 | |
发表时间:2010-12-01
动量守恒定律。
|
|
返回顶楼 | |
发表时间:2010-12-01
1、一个球和两个球时问题自动解决。
2、3个球,满足两个条件有解,第一至少两个球处于同一行或同一列。第二碰撞点与第三个球处于同一行或同一列。 3、4个球:第一,至少两个球处于同一行或同一列。如果有多个组合满足情况,将所有可能情况运行一遍,此时剩三个球。判断3个球有解得条件的 4、。。。 5、 下面就是递归 |
|
返回顶楼 | |
发表时间:2010-12-01
tomorrow009 写道 疑惑:小球是只有从“远处”移动过来才可以碰撞么?
即: 假如最后剩下两个相邻小球, b1(1,2) , b2(2,2), 那么是否可以使用b1撞走b2,而b1位置不变,并认定为有解呢? 对不起。这个没讲清楚。两个球相邻是不能动的。中间一定要有至少一个的空格。 |
|
返回顶楼 | |
发表时间:2010-12-01
suntao19830709 写道 正面做这个问题可以,但是比较麻烦。例如需要递归,每一步还需要记住当前棋盘小球的位置。而且由于递归的需要,可能要创建大量的这样的位置信息。
但是这个题目并没有限定死,任意初始化棋盘上的小球,然后判断是否有解,有解打印出球移动步骤,否则输入无解。 关键这个任意并不是要输出全部的。我们完全可以模拟一种“伪任意”,可以按照下面偷个巧。 按下面步骤: 1:一开始随机生成一个任意位置的小球 2:假想这个小球是x,是另一个随机的小球y撞过来的。 3:把第二步的y当成x,再新建一个随机的小球y,假想它撞了当前的x(第二步里的y) 4:重复若干次步骤3 5:把最终各个小球的位置当成初始位置,然后逆向打出上面的结果。 如果要无解的那种有点类似上面有人提到的,生成一个类似8皇后的即可。 这样其实比较容易。以前看到有的游戏不会创建无解的初始位置,相信通过这种方式比较容易实现。 呵呵。这个是个偷懒的办法。转个题目的空子。谢谢 |
|
返回顶楼 | |
发表时间:2010-12-01
最后修改:2010-12-01
编辑一下,原来写的思路有问题
|
|
返回顶楼 | |
发表时间:2010-12-03
最后修改:2010-12-03
用上下左右的走递归写了个,求批。
import java.util.Random; public class Main { private StringBuilder solution = new StringBuilder(); public static void main(String[] args) { Main main = new Main(); // main.doHit(main.generateTable(5, 5, 4)); boolean[][] table = new boolean[5][5]; table[0][0] = true; table[2][0] = true; table[3][0] = true; table[2][4] = true; table[3][0] = true; table[0][3] = true; System.out.println("table is: \n" + main.getTableString(table)); main.doHit(table); if (main.solution.length() == 0) { System.out.println("There is not any solution"); } else { main.solution.insert(0, "There is a solution.\n"); System.out.println(main.solution.toString()); } } public boolean[][] generateTable(int rowSize, int colSize, int nums) { boolean[][] table = new boolean[rowSize][colSize]; Random random = new Random(); while (nums != 0) { int x = random.nextInt(rowSize); int y = random.nextInt(colSize); if (table[x][y] == true) { continue; } else { table[x][y] = true; nums--; } } System.out.println("New generate table is: \n"); System.out.println(getTableString(table)); return table; } public boolean doHit(boolean[][] table) { for (int i = 0; i < table.length; i++) { for (int j = 0; j < table[i].length; j++) { if (table[i][j]) { if (goUp(table, i, j)) { return true; } if (goDown(table, i, j)) { return true; } if (goLeft(table, i, j)) { return true; } if (goRight(table, i, j)) { return true; } } } } return false; } private boolean goUp(boolean[][] table, int i, int j) { table = getNewCopy(table); boolean didHit = false; StringBuilder sb = new StringBuilder(); sb.append("the ball at (").append(i).append(",").append(j).append( ") hit the ball by up going."); if (i - 2 >= 0 && !table[i - 1][j]) { for (int k = i - 2; k >= 0; k--) { if (table[k][j]) { didHit = true; table[i][j] = false; table[k + 1][j] = true; table[k][j] = false; i = k; } } } sb.append(" After hit, the new table is:\n").append( getTableString(table)); boolean result = checkAndDo(table, didHit); if (result) { solution.insert(0, sb.toString()); } return result; } private boolean goDown(boolean[][] table, int i, int j) { table = getNewCopy(table); boolean didHit = false; StringBuilder sb = new StringBuilder(); sb.append("the ball at (").append(i).append(",").append(j).append( ") hit the ball by down going."); if (i + 2 < table.length && !table[i + 1][j]) { for (int k = i + 2; k < table.length; k++) { if (table[k][j]) { didHit = true; table[i][j] = false; table[k - 1][j] = true; table[k][j] = false; i = k; } } } sb.append(" After hit, the new table is:\n").append( getTableString(table)); boolean result = checkAndDo(table, didHit); if (result) { solution.insert(0, sb.toString()); } return result; } private boolean goLeft(boolean[][] table, int i, int j) { table = getNewCopy(table); boolean didHit = false; StringBuilder sb = new StringBuilder(); sb.append("the ball at (").append(i).append(",").append(j).append( ") hit the ball by left going."); if (j - 2 >= 0 && !table[i][j - 1]) { for (int k = j - 2; k >= 0; k--) { if (table[i][k]) { didHit = true; table[i][j] = false; table[i][k + 1] = true; table[i][k] = false; j = k; } } } sb.append(" After hit, the new table is:\n").append( getTableString(table)); boolean result = checkAndDo(table, didHit); if (result) { solution.insert(0, sb.toString()); } return result; } private boolean goRight(boolean[][] table, int i, int j) { table = getNewCopy(table); boolean didHit = false; StringBuilder sb = new StringBuilder(); sb.append("the ball at (").append(i).append(",").append(j).append( ") hit the ball by right going."); if (j + 2 < table[0].length && !table[i][j + 1]) { for (int k = j + 2; k < table[i].length; k++) { if (table[i][k]) { didHit = true; table[i][j] = false; table[i][k - 1] = true; table[i][k] = false; j = k; } } } sb.append(" After hit, the new table is:\n").append( getTableString(table)); boolean result = checkAndDo(table, didHit); if (result) { solution.insert(0, sb.toString()); } return result; } private boolean checkAndDo(boolean[][] table, boolean didHit) { if (isEnd(table)) { return true; } else { if (didHit) { return doHit(table); } else { return false; } } } private boolean[][] getNewCopy(boolean[][] table) { boolean[][] copy = table.clone(); for (int i = 0; i < copy.length; i++) { copy[i] = table[i].clone(); } return copy; } private boolean isEnd(boolean[][] table) { boolean haveOne = false; for (int i = 0; i < table.length; i++) { for (int j = 0; j < table[i].length; j++) { if (table[i][j] && !haveOne) { haveOne = true; } else if (table[i][j] && haveOne) { return false; } } } return true; } private String getTableString(boolean[][] table) { StringBuilder sb = new StringBuilder(); for (int i = 0; i < table.length; i++) { for (int j = 0; j < table[i].length; j++) { if (j != 0) { sb.append(" , "); } if (table[i][j]) { sb.append("O"); } else { sb.append("X"); } } sb.append("\n"); } return sb.toString(); } } |
|
返回顶楼 | |
发表时间:2010-12-03
只想到了暴力的方法,迭代+递归每一种情况。。。。
|
|
返回顶楼 | |