平面上的正方形格子被填上黑色或白色。在其中一格正方形內有一隻“螞蟻”。
螞蟻的頭部朝向爲:上下左右其中一方。
螞蟻的移動規則十分簡單:
若螞蟻在黑格,右轉90度,將該格改爲白格,並向前移一格;
若螞蟻在白格,左轉90度,將該格改爲黑格,並向前移一格。
規則雖然簡單,螞蟻的行爲卻十分複雜。剛剛開始時留下的路線都會有接近對稱,像是會重複,但不論起始狀態如何,螞蟻經過漫長的混亂活動後,會開闢出一條規則的“高速公路”。
螞蟻的路線是很難事先預測的。
你的任務是根據初始狀態,用計算機模擬蘭頓螞蟻在第n步行走後所處的位置。
接下來是 m 行數據。
每行數據爲 n 個被空格分開的數字。0 表示白格,1 表示黑格。
接下來是一行數據:x y s k, 其中x y爲整數,表示螞蟻所在行號和列號(行號從上到下增長,列號從左到右增長,都是從0開始編號)。s 是一個大寫字母,表示螞蟻頭的朝向,我們約定:上下左右分別用:UDLR表示。k 表示螞蟻走的步數。
0 0 0 0 0 0
0 0 0 0 0 0
0 0 1 0 0 0
0 0 0 0 0 0
0 0 0 0 0 0
2 3 L 5
0 0 0
1 1 1
1 1 1
1 1 U 6
0 0
分析:這是一個模擬題,只要處理好方向的轉換和地圖的變換就可以,這裏推薦使用函數來完成功能,因爲本題需要做很多事情,比如在不同的地圖位置的轉向,獲得x,y的下個座標,都許多的判斷條件,都是線性的代碼。
/**
*
*/
package 歷屆試題;
/**
* @author Administrator
*
*/
import java.util.Scanner;
public class 蘭頓螞蟻1 {
public static void main(String[] args) {
char[] lz = { 'L', 'D', 'R', 'U' }; // 左轉方向數組
char[] rz = { 'L', 'U', 'R', 'D' }; // 右轉方向數組
Scanner in = new Scanner(System.in);
int n = in.nextInt();
int m = in.nextInt();
int[][] maps = new int[n][m];
for (int i = 0; i < n; i++)
for (int j = 0; j < m; j++)
maps[i][j] = in.nextInt();
int x = in.nextInt();
int y = in.nextInt();
char s = in.next().trim().charAt(0);
int k = in.nextInt();
for (int j = 0, i = 0; j < k; j++) {
if (maps[x][y] == 1) { // 黑色格子 右轉90度
maps[x][y] = 0; // 置爲白色格子
for (i = 0; i < 4; i++)
if (rz[i] == s)
break;
s = rz[(i + 1) % 4];
switch (s) {
case 'L':
y--;
break;
case 'R':
y++;
break;
case 'U':
x--;
break;
case 'D':
x++;
break;
}
} else { // 白色格子 左轉90度
maps[x][y] = 1; // 置爲黑色格子
for (i = 0; i < 4; i++)
if (lz[i] == s)
break;
s = lz[(i + 1) % 4];
switch (s) {
case 'L':
y--;
break;
case 'R':
y++;
break;
case 'U':
x--;
break;
case 'D':
x++;
break;
}
}
}
System.out.println(x + " " + y);
}
}