7-10 机器人拼图
给定一块由 n×m 个格子组成的矩形拼图板,本题要求你根据给定的机械手移动指令集,将拼图中的碎片逐一放到指定位置。
机械手每次抓取一块碎片,都会在拼图板的左上角位置等待指令。一个指令集是由 0-4 这五个数字组成的字符串,每个数字代表的意义如下:
- 1:向右移动一格;
- 2:向下移动一格;
- 3:向左移动一格;
- 4:向上移动一格;
- 0:将碎片放置在当前位置,并结束这次任务。
如果指令要求机械手移动到拼图板边界外,机械手会无视这个指令。如果接收到指令 0 时,当前位置上已经有一块碎片放好了,机械手会扔掉手里的碎片,结束这次任务。
输入格式:
输入第一行给出 2 个正整数 n 和 m(1≤n,m≤100),随后一共有 n×m 行,第 i 行给出编号为 i(i=1,⋯nm)的碎片对应的指令集,每条指令集一定以唯一的 0 结尾。
输出格式:
输出 n 行,每行 m 个整数,为放置在对应位置上的碎片编号。如果该位置上没有碎片,则输出 0。一行中的数字间以 1 个空格分隔,行首位不得有多余空格。
输入样例:
tex
2 3
1120
21140
34120
0
110
21111340
2 3
1120
21140
34120
0
110
21111340
输出样例:
tex
4 6 2
0 3 1
4 6 2
0 3 1
Solution:
java
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
String[] input = in.readLine().split(" ");
int n = Integer.parseInt(input[0]);
int m = Integer.parseInt(input[1]);
int row = n * m;
int[][] map = new int[n + 1][m + 1];
for (int i = 1; i <= row; i++) {
char[] c = in.readLine().toCharArray();
int x = 1, y = 1;
for (int j = 0; j < c.length; j++) {
int op = c[j] - '0';
if (op == 1 && y != m) {
y++;
} else if (op == 2 && x != n) {
x++;
} else if (op == 3 && y != 1) {
y--;
} else if (op == 4 && x != 1) {
x--;
}
}
if (map[x][y] == 0) {
map[x][y] = i;
}
}
StringBuilder sb = new StringBuilder();
for (int i = 1; i < n + 1; i++) {
for (int j = 1; j < m + 1; j++) {
sb.append(map[i][j]);
if (j < m) sb.append(" ");
}
if (i < n) sb.append("\n");
}
System.out.println(sb);
}
}
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
String[] input = in.readLine().split(" ");
int n = Integer.parseInt(input[0]);
int m = Integer.parseInt(input[1]);
int row = n * m;
int[][] map = new int[n + 1][m + 1];
for (int i = 1; i <= row; i++) {
char[] c = in.readLine().toCharArray();
int x = 1, y = 1;
for (int j = 0; j < c.length; j++) {
int op = c[j] - '0';
if (op == 1 && y != m) {
y++;
} else if (op == 2 && x != n) {
x++;
} else if (op == 3 && y != 1) {
y--;
} else if (op == 4 && x != 1) {
x--;
}
}
if (map[x][y] == 0) {
map[x][y] = i;
}
}
StringBuilder sb = new StringBuilder();
for (int i = 1; i < n + 1; i++) {
for (int j = 1; j < m + 1; j++) {
sb.append(map[i][j]);
if (j < m) sb.append(" ");
}
if (i < n) sb.append("\n");
}
System.out.println(sb);
}
}