<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);}
}