蘭頓螞蟻,是于1986年炬搭,由克里斯·蘭頓提出來的蜈漓,屬于細(xì)胞自動(dòng)機(jī)的一種。
平面上的正方形格子被填上黑色或白色宫盔。在其中一格正方形內(nèi)有一只“螞蟻”融虽。
螞蟻的頭部朝向?yàn)椋荷舷伦笥移渲幸环健?/p>
螞蟻的移動(dòng)規(guī)則十分簡單:
若螞蟻在黑格,右轉(zhuǎn)90度灼芭,將該格改為白格有额,并向前移一格;
若螞蟻在白格,左轉(zhuǎn)90度巍佑,將該格改為黑格茴迁,并向前移一格。
規(guī)則雖然簡單萤衰,螞蟻的行為卻十分復(fù)雜堕义。剛剛開始時(shí)留下的路線都會(huì)有接近對(duì)稱,像是會(huì)重復(fù)脆栋,但不論起始狀態(tài)如何倦卖,螞蟻經(jīng)過漫長的混亂活動(dòng)后,會(huì)開辟出一條規(guī)則的“高速公路”筹吐。
螞蟻的路線是很難事先預(yù)測的糖耸。
你的任務(wù)是根據(jù)初始狀態(tài),用計(jì)算機(jī)模擬蘭頓螞蟻在第n步行走后所處的位置丘薛。
輸入格式
輸入數(shù)據(jù)的第一行是 m n 兩個(gè)整數(shù)(3 < m, n < 100)嘉竟,表示正方形格子的行數(shù)和列數(shù)。
接下來是 m 行數(shù)據(jù)洋侨。
每行數(shù)據(jù)為 n 個(gè)被空格分開的數(shù)字舍扰。0 表示白格,1 表示黑格希坚。
接下來是一行數(shù)據(jù):x y s k, 其中x y為整數(shù)边苹,表示螞蟻所在行號(hào)和列號(hào)(行號(hào)從上到下增長,列號(hào)從左到右增長裁僧,都是從0開始編號(hào))个束。s 是一個(gè)大寫字母,表示螞蟻頭的朝向聊疲,我們約定:上下左右分別用:UDLR表示茬底。k 表示螞蟻?zhàn)叩牟綌?shù)。
輸出格式
輸出數(shù)據(jù)為兩個(gè)空格分開的整數(shù) p q, 分別表示螞蟻在k步后获洲,所處格子的行號(hào)和列號(hào)阱表。
樣例輸入
5 6
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
樣例輸出
1 3
樣例輸入
3 3
0 0 0
1 1 1
1 1 1
1 1 U 6
樣例輸出
0 0
思考:
1、上下左右四個(gè)方向分別對(duì)坐標(biāo)的影響是贡珊?
向上移動(dòng):橫坐標(biāo)減1
向下移動(dòng):橫坐標(biāo)加1
向左移動(dòng):縱坐標(biāo)減1
向右移動(dòng):縱坐標(biāo)加1
注意點(diǎn)最爬,坐標(biāo)減一的過程中會(huì)出現(xiàn)負(fù)數(shù),這樣可以采取減一之后加上長度然后再對(duì)長度取余的方法门岔。
2爱致、經(jīng)過旋轉(zhuǎn)操作發(fā)現(xiàn)規(guī)律,定義方向數(shù)組String[] direction = new String[] {"U","R","D","L"}寒随,這時(shí)如果是白格的話蒜鸡, 方向數(shù)組下標(biāo)遞減就是旋轉(zhuǎn)后的方向胯努,如果是黑格的話,方向數(shù)組下標(biāo)遞增就是旋轉(zhuǎn)后的方向逢防。
代碼如下
package yearlyExamination;
import java.util.Scanner;
public class Lx33_LantonAnt {
public static void main(String[] args) {
// TODO Auto-generated method stub
String[] direction = new String[] {"U","R","D","L"};
Scanner reader = new Scanner(System.in);
int m = reader.nextInt();
int n = reader.nextInt();
int[][] nArray = new int[m][n];
for(int i=0;i<m;i++)
{
for(int j =0;j<n;j++)
{
nArray[i][j] = reader.nextInt();
}
}
int x = reader.nextInt();
int y = reader.nextInt();
String s = reader.next();
int k = reader.nextInt();
int d = 0;//記錄方向在數(shù)組中的下標(biāo)
for(int i=0;i<4;i++)
{
if(direction[i].equals(s))
{
d = i;
}
}
//System.out.println("d "+direction[d]);
Ant ant = new Ant(x,y);
for(int i=0;i<k;i++)
{
//發(fā)現(xiàn)規(guī)律 如果是白格的話 方向數(shù)組下標(biāo)遞減就是旋轉(zhuǎn)后的方向
//黑格時(shí)叶沛,方向數(shù)組下標(biāo)遞增就是旋轉(zhuǎn)后的方向
//System.out.println("nArray[x][y]"+nArray[x][y]);
if(nArray[ant.x][ant.y] == 0)
{
nArray[ant.x][ant.y] = 1;
d = (d-1+4)%4;//得到旋轉(zhuǎn)后的方向下標(biāo)
s = direction[d];
goWalk(ant, s, m, n);//移動(dòng)
}else {
nArray[ant.x][ant.y] = 0;
d = (d+1)%4;
s = direction[d];
goWalk(ant, s, m, n);
}
//System.out.println(ant.x + " " + ant.y);
}
System.out.println(ant.x+" " +ant.y);
}
public static void goWalk(Ant ant,String s,int m,int n) {
switch(s)
{
case "U":
ant.x = (ant.x-1+m)%m;
break;
case "L":
ant.y= (ant.y-1+n)%n;
break;
case "D":
ant.x = (ant.x+1)%m;
break;
case "R":
ant.y = (ant.y+1)%n;
break;
default:
break;
}
}
}
class Ant{
/**
* 螞蟻?zhàn)鴺?biāo)類,用于保存螞蟻移動(dòng)時(shí)的橫縱坐標(biāo)
*/
public int x;//橫坐標(biāo)
public int y;//縱坐標(biāo)
public Ant(int x,int y)
{
this.x = x;
this.y = y;
}
}