论坛首页 综合技术论坛

EMC笔试题(最后一道编程题)

浏览 25064 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2010-12-01  

没有看懂题目。

为何没有两个小球碰撞情况。

此题可否如此理解,三个小球只要横坐标或纵坐标相同,此题误解。或是两个小球碰撞后横坐标或纵坐标相邻此题无解
其他情况均为有解。
0 请登录后投票
   发表时间:2010-12-01  
只想到穷举回溯。
0 请登录后投票
   发表时间:2010-12-01  
好像比较难,谁给出一种解法啊?
0 请登录后投票
   发表时间:2010-12-01  
动量守恒定律。
0 请登录后投票
   发表时间:2010-12-01  
1、一个球和两个球时问题自动解决。
2、3个球,满足两个条件有解,第一至少两个球处于同一行或同一列。第二碰撞点与第三个球处于同一行或同一列。
3、4个球:第一,至少两个球处于同一行或同一列。如果有多个组合满足情况,将所有可能情况运行一遍,此时剩三个球。判断3个球有解得条件的
4、。。。
5、
下面就是递归
0 请登录后投票
   发表时间:2010-12-01  
tomorrow009 写道
疑惑:小球是只有从“远处”移动过来才可以碰撞么?
即: 假如最后剩下两个相邻小球, b1(1,2) , b2(2,2), 那么是否可以使用b1撞走b2,而b1位置不变,并认定为有解呢?

对不起。这个没讲清楚。两个球相邻是不能动的。中间一定要有至少一个的空格。
0 请登录后投票
   发表时间:2010-12-01  
suntao19830709 写道
正面做这个问题可以,但是比较麻烦。例如需要递归,每一步还需要记住当前棋盘小球的位置。而且由于递归的需要,可能要创建大量的这样的位置信息。

但是这个题目并没有限定死,任意初始化棋盘上的小球,然后判断是否有解,有解打印出球移动步骤,否则输入无解。
关键这个任意并不是要输出全部的。我们完全可以模拟一种“伪任意”,可以按照下面偷个巧。

按下面步骤:
1:一开始随机生成一个任意位置的小球
2:假想这个小球是x,是另一个随机的小球y撞过来的。
3:把第二步的y当成x,再新建一个随机的小球y,假想它撞了当前的x(第二步里的y)
4:重复若干次步骤3
5:把最终各个小球的位置当成初始位置,然后逆向打出上面的结果。

如果要无解的那种有点类似上面有人提到的,生成一个类似8皇后的即可。

这样其实比较容易。以前看到有的游戏不会创建无解的初始位置,相信通过这种方式比较容易实现。


呵呵。这个是个偷懒的办法。转个题目的空子。谢谢
0 请登录后投票
   发表时间:2010-12-01   最后修改:2010-12-01
编辑一下,原来写的思路有问题
0 请登录后投票
   发表时间: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();
	}
}
0 请登录后投票
   发表时间:2010-12-03  
只想到了暴力的方法,迭代+递归每一种情况。。。。
0 请登录后投票
论坛首页 综合技术版

跳转论坛:
Global site tag (gtag.js) - Google Analytics