EMC面试题目Word文档格式.docx
《EMC面试题目Word文档格式.docx》由会员分享,可在线阅读,更多相关《EMC面试题目Word文档格式.docx(6页珍藏版)》请在冰豆网上搜索。
#G#G###
#######
#G#####
两个球相邻是不能动的。
中间一定要有至少一个的空格。
当碰撞过后,只有一个球在棋盘上为有解。
否则无解。
每次选择任意一个球开始运动,碰撞完成后,可以选择任意剩下小球开始运动。
请写出一个程序,任意初始化棋盘上的小球,然后判断是否有解,有解打印出球移动步骤,否则输入无解。
提供一些逻辑,大家讨论。
①感觉是推箱子+动量守恒,每当发生箱子被推出界外,则必须再手动给予一个动量。
②还是递归来解(可能存在多个解)
手动给予任意球任意方向(4个方向)一动量,满足③的递归条件则继续迭代,否则当前无解返回。
再循环下一个球,只有到最后满足有解时才反向打出所有运动轨迹(所以每一步运动轨迹必须保存)。
③递归的条件是:
1.至少在某行(列)上存在两个或两个以上的球,且其行(列)坐标差>
1
2.至少存在两个或两个以上的球,其行(列)的坐标差=1
importjava.util.Random;
publicclassMain{
privateStringBuildersolution=newStringBuilder();
publicstaticvoidmain(String[]args){
Mainmain=newMain();
//main.doHit(main.generateTable(5,5,4));
boolean[][]table=newboolean[5][5];
table[0][0]=true;
table[2][0]=true;
table[3][0]=true;
table[2][4]=true;
table[0][3]=true;
System.out.println("
tableis:
\n"
+main.getTableString(table));
main.doHit(table);
if(main.solution.length()==0){
Thereisnotanysolution"
);
}else{
main.solution.insert(0,"
Thereisasolution.\n"
System.out.println(main.solution.toString());
}
publicboolean[][]generateTable(introwSize,intcolSize,intnums){
boolean[][]table=newboolean;
Randomrandom=newRandom();
while(nums!
=0){
intx=random.nextInt(rowSize);
inty=random.nextInt(colSize);
if(table==true){
continue;
table=true;
nums--;
Newgeneratetableis:
System.out.println(getTableString(table));
returntable;
publicbooleandoHit(boolean[][]table){
for(inti=0;
i<
table.length;
i++){
for(intj=0;
j<
j++){
if(table){
if(goUp(table,i,j)){
returntrue;
if(goDown(table,i,j)){
if(goLeft(table,i,j)){
if(goRight(table,i,j)){
returnfalse;
privatebooleangoUp(boolean[][]table,inti,intj){
table=getNewCopy(table);
booleandidHit=false;
StringBuildersb=newStringBuilder();
sb.append("
theballat("
).append(i).append("
"
).append(j).append(
"
)hittheballbyupgoing."
if(i-2>
=0&
&
!
table){
for(intk=i-2;
k>
=0;
k--){
didHit=true;
table=false;
i=k;
Afterhit,thenewtableis:
\n"
).append(
getTableString(table));
booleanresult=checkAndDo(table,didHit);
if(result){
solution.insert(0,sb.toString());
returnresult;
privatebooleangoDown(boolean[][]table,inti,intj){
)hittheballbydowngoing."
if(i+2<
table.length&
for(intk=i+2;
k<
k++){
privatebooleangoLeft(boolean[][]table,inti,intj){
)hittheballbyleftgoing."
if(j-2>
for(intk=j-2;
j=k;
privatebooleangoRight(boolean[][]table,inti,intj){
)hittheballbyrightgoing."
if(j+2<
table[0].length&
for(intk=j+2;
privatebooleancheckAndDo(boolean[][]table,booleandidHit){
if(isEnd(table)){
if(didHit){
returndoHit(table);
privateboolean[][]getNewCopy(boolean[][]table){
boolean[][]copy=table.clone();
copy.length;
copy=table.clone();
returncopy;
privatebooleanisEnd(boolean[][]table){
booleanhaveOne=false;
if(table&
haveOne){
haveOne=true;
}elseif(table&
haveOne){
privateStringgetTableString(boolean[][]table){
if(j!
"
O"
X"
returnsb.toString();
}