タイトル説明
ラングトンのアリは、クリス・ラングトンが提示し、1986年にあったセルオートマトンに属する、来ます。
正方格子面は、黒または白の塗りつぶしです。これでグリッドの正方形は「アリ」を持っています
アリの頭の向きは:前記左右の垂直面。
アリ移動規則は非常に単純である:
アリヘイグ、90度右折、細胞に白血球、前方のセルがあれば、
アリ白血球場合、90度左、黒グリッドにグリッド、および前進1つのスペース。
ルールはシンプルですが、アリの非常に複雑な挙動。私はラインを起動するときに、繰り返しのように、ほぼ左右対称があるでしょうが、関係なく、初期状態の、アリが長い混沌活動した後、ルールが開くだろう左の「高速道路を。」
蟻の経路は事前に予測することは非常に困難です。
あなたの仕事は、初期状態において、nは左足の位置ラングトンのアリコンピュータシミュレーションです。
エントリー
入力データラインの最初の行は、MN二つの整数(3 <M、N <100である )、 正方格子の行と列の数。
次は、データのm行です。
データの各行は、スペースのN個に分割されています。0は白セルを表し、ヘイグ1を表します。
xysk、xyは整数、行と列の数にアリ(行番号は0から番号付けされている右の列数の増加に左、上から下に向かって成長した)である:次のデータの行です。Sは大文字で、ヘッドアリの向きを示す、我々は合意された:それぞれ上下と:表現UDLR。kはアリのためのステップの数を表します。
輸出
出力データは、スペースで区切られた整数PQ、k個のステップの後に、それぞれANT、格子の行番号と列番号です。
サンプル入力
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
問題解決のためのアイデア
単純な検索DFS、行列番号のランクに注意を払うが、ゼロベースれます
コード
package 兰顿蚂蚁;
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner in=new Scanner(System.in);
int m=in.nextInt();
int n=in.nextInt();
int [][]a=new int[110][110];
for(int i=0;i<m;i++)
{
for(int j=0;j<n;j++)
{
a[i][j]=in.nextInt();
}
}
int x,y,k;
x=in.nextInt();
y=in.nextInt();
char s = in.next().charAt(0);
k=in.nextInt();
//System.out.println(x+" "+y+" "+k);
dfs(x,y,s,k,a);
}
public static void dfs(int x,int y,char s,int k,int a[][])
{
if(k==0)
{
System.out.println(x+" "+y);
return ;
}
//System.out.println(a[x][y]);
//System.out.println(x+" "+y);
if(a[x][y]==1)
{
a[x][y]=0;
if(s=='U')
{
dfs(x,y+1,'R',k-1,a);
}
if(s=='R')
{
dfs(x+1,y,'D',k-1,a);
}
if(s=='D')
{
dfs(x,y-1,'L',k-1,a);
}
if(s=='L')
{
dfs(x-1,y,'U',k-1,a);
}
}
else
{
a[x][y]=1;
if(s=='U')
{
dfs(x,y-1,'L',k-1,a);
}
if(s=='R')
{
dfs(x-1,y,'U',k-1,a);
}
if(s=='D')
{
dfs(x,y+1,'R',k-1,a);
}
if(s=='L')
{
dfs(x+1,y,'D',k-1,a);
}
}
}
}