网易笔试题 推箱子

<pre name="code" class="java">
时间限制:10000ms单点时限:1000ms内存限制:256MB描述推箱子是一款经典游戏。如图所示,灰色格子代表不能通过区域,蓝色方格是箱子,黑色圆形代表玩家,含有圆点的格子代表目标点。push.png规定以下规则:1、一局游戏中只会有一个箱子,一个玩家和一个目标点。2、通过方向键控制玩家移动。3、图中的灰色格子代表墙壁,玩家与箱子都不能通过。4、推到墙壁的箱子,就无法再将箱子推离墙壁,因为玩家无法到达箱子靠墙壁的一侧去推箱子。也就是说箱子只能以“被推”的方式被移动,不是以“被拉”的方式被移动。但如果玩家将箱子推至墙壁后,垂直墙壁的两侧没有阻碍物,则玩家可以朝这两个不同的方向推移箱子。如果箱子进入角落,就没有办法再推动这个箱子了。5、玩家是不能走出场景的。玩家推着箱子到达场景边缘,如果继续点击使玩家和箱子向墙壁前进的方向键,箱子和人都会保持不动。玩家的前进方向上如果有墙壁,也是不能前进的。但是这些点击都视为合理的输入。6、箱子一旦到达目标点,就不能再移动了。但这时,玩家仍然可以在场景内自由行动。如果继续尝试推箱子,那么玩家将会和箱子一起保持在原地不动。现在,给出一种方向键的点击方案,请判断,这种方案是否能使箱子最终停在目标点上。为了方便表示,我们以0代表空白格子,以4代表不能通过区域,以1代表玩家,以3代表箱子,以2代表目标点。输入第一行数据包含三个整数,N,M,S。其中,N(0 < N <= 100)代表格子的宽度,M(0 < M <= 100)代表格子的高度,S(0 < S <= 200)代表测试点的个数。接下来的M行,每行都会有N个字符,描述当前的盘面。接下来的S行,每行都代表一个测试点。每行都以一个整数T(0 < T <= 10000)开头,接下来是一个空格和T个字符。这T个字符仅由d,u,l,r这四个字母组成,分别代表了敲击向下,向上,向左,向右的方向键。输出对于每个测试点,输出最后箱子是否在目标点上。如果是,输出YES,如果不是,则输出NO。样例输入5 4 3000001300000200000004 rurd6 urdldr6 rrrurd样例输出YESYESNO
 
  
这道题是简单题,但是我花了两个小时没做出来。
原因
1,长跟宽弄反了,改了半小时
2,输入“00000”的时候应该是转成char数组存储,我原本用int来存,结果输入变成了0,改了半小时。
3,把char二维数组进行深复制而不是char[][]gametmp=game;,这样子会修改到原来的game的内容。

终极原因是不熟悉这个新平台。和Java的特性。

上个代码
package leetcode;

import java.util.Scanner;

public class Main {
	public static void main(String[] args) {
		Scanner in = new Scanner(System.in);
		int kuan = in.nextInt();
		int chang = in.nextInt();
		int time = in.nextInt();
		String sre="";
		char[][] game = new char[chang][kuan];
		int inkuan = 0, inchang = 0;
		int dekuan = 0, dechang = 0;
		// while(in.hasNextInt()){
		for (int ic = 0; ic < chang; ++ic)
			game[ic] = in.next().toCharArray();
		for (int ic = 0; ic < chang; ++ic)
			for (int ik = 0; ik < kuan; ++ik) {

				if (game[ic][ik] == '1') {
					inkuan = ik;
					inchang = ic;
				}
				if (game[ic][ik] == '2') {
					dekuan = ik;
					dechang = ic;
				}
				//System.out.println(ic + " " + ik + " " + game[ic][ik]);
				//System.out.flush();
			}
		//System.out.println("people" +inchang+ " " + inkuan + " des" + dechang+" "+dekuan);
		int count = 0;
		while (count < time) {
			count++;
			int strlen = in.nextInt();
			String str = in.next();
		//	System.out.println(strlen+" "+str);
			char [][] gametmp=new char[chang][kuan];
			for(int fi=0;fi<chang;++fi)
				for(int fj=0;fj<kuan;++fj)gametmp[fi][fj]=game[fi][fj];
			int click = 0;
			int ictmp = inchang;
			int iktmp = inkuan;
			boolean result = false;
			while (click < strlen) {
				//System.out.println(str.charAt(click));
				if (str.charAt(click) == 'u' && ictmp > 0) {
					//System.out.println("u0");
					if (gametmp[ictmp - 1][iktmp] == '0') {
						gametmp[ictmp][iktmp] = '0';
						gametmp[ictmp - 1][iktmp] = '1';
						ictmp--;
					//	System.out.println("u1"+(ictmp-1));
					} else if (gametmp[ictmp - 1][iktmp] == '3' && ictmp > 1) {
						if (ictmp - 2 == dechang && iktmp == dekuan) {
							// System.out.println("yes");
							result = true;
						//	System.out.println("u2"+(ictmp-1));
						} else {
							gametmp[ictmp - 2][iktmp] = '3';
							gametmp[ictmp - 1][iktmp] = '1';
							gametmp[ictmp][iktmp] = '0';
							ictmp--;
						//	System.out.println("u3"+(ictmp-1));
						}
					}
					//continue;
				} 
				else if (str.charAt(click) == 'd' && ictmp < chang - 1) {
				//	System.out.println("d0");
					if (gametmp[ictmp + 1][iktmp] == '0') {
						gametmp[ictmp][iktmp] = '0';
						gametmp[ictmp + 1][iktmp] = '1';
						ictmp++;
					//	System.out.println("d1"+(ictmp+1));
					} else if (gametmp[ictmp + 1][iktmp] == '3'
							&& ictmp < chang - 2) {
						if (ictmp + 2 == dechang && iktmp == dekuan) {
							result = true;
						//	System.out.println("d2"+(ictmp+1));
						} else {
							gametmp[ictmp + 2][iktmp] = '3';
							gametmp[ictmp + 1][iktmp] = '1';
							gametmp[ictmp][iktmp] = '0';
							ictmp++;
						//System.out.println("d3"+(ictmp+1));
						}
					}
					//continue;
				} 
				else if (str.charAt(click) == 'r' && iktmp < kuan - 1) {
				//	System.out.println("r0");
					if (gametmp[ictmp][iktmp + 1] == '0') {
						gametmp[ictmp][iktmp] = '0';
						gametmp[ictmp][iktmp + 1] = '1';
						iktmp++;
					//	System.out.println("r1"+(iktmp+1));
					} else if (gametmp[ictmp][iktmp + 1] == '3'
							&& iktmp < kuan - 2) {
						if (ictmp == dechang && iktmp + 2 == dekuan) {
							result = true;
						//	System.out.println("r2"+(iktmp+1));
						} else {
							gametmp[ictmp][iktmp + 2] = '3';
							gametmp[ictmp][iktmp + 1] = '1';
							gametmp[ictmp][iktmp] = '0';
							iktmp++;
						//	System.out.println("r3"+(iktmp+1));
						}
					}
					//continue;
				} 
				else if (str.charAt(click) == 'l' && iktmp > 0) {
				//	System.out.println("l0");
					if (gametmp[ictmp][iktmp - 1] =='0') {
						gametmp[ictmp][iktmp] = '0';
						gametmp[ictmp][iktmp - 1] = '1';
						iktmp--;
						//System.out.println("l1"+(iktmp-1));
					} else if (gametmp[ictmp][iktmp - 1] == '3' && iktmp > 1) {
						if (ictmp == dechang && iktmp - 2 == dekuan) {
							result = true;
						} else {
							gametmp[ictmp][iktmp - 2] = '3';
							gametmp[ictmp][iktmp - 1] = '1';
							gametmp[ictmp][iktmp] = '0';
							iktmp--;
						}
					}
					//continue;
				}
				click++;
			}
			if (result)
				sre+="YES\n";
			else
				sre+="NO\n";
			

		}
	
	System.out.println(sre);}
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值