兰顿蚂蚁【第五届】【省赛】【C组】
资源限制
时间限制:1.0s 内存限制:256.0MB
兰顿蚂蚁,是于1986年,由克里斯·兰顿提出来的,属于细胞自动机的一种。
平面上的正方形格子被填上黑色或白色。在其中一格正方形内有一只“蚂蚁”。
蚂蚁的头部朝向为:上下左右其中一方。
蚂蚁的移动规则十分简单:
若蚂蚁在黑格,右转90度,将该格改为白格,并向前移一格;
若蚂蚁在白格,左转90度,将该格改为黑格,并向前移一格。
规则虽然简单,蚂蚁的行为却十分复杂。刚刚开始时留下的路线都会有接近对称,像是会重复,但不论起始状态如何,蚂蚁经过漫长的混乱活动后,会开辟出一条规则的“高速公路”。
蚂蚁的路线是很难事先预测的。
你的任务是根据初始状态,用计算机模拟兰顿蚂蚁在第n步行走后所处的位置。
数据格式
输入数据的第一行是 m n 两个整数(3 < m, n < 100),表示正方形格子的行数和列数。
接下来是 m 行数据。
每行数据为 n 个被空格分开的数字。0 表示白格,1 表示黑格。
接下来是一行数据:x y s k, 其中x y为整数,表示蚂蚁所在行号和列号(行号从上到下增长,列号从左到右增长,都是从0开始编号)。s 是一个大写字母,表示蚂蚁头的朝向,我们约定:上下左右分别用:UDLR表示。k 表示蚂蚁走的步数。
输出数据为两个空格分开的整数 p q, 分别表示蚂蚁在k步后,所处格子的行号和列号。
例如, 输入:
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
资源约定:
峰值内存消耗(含虚拟机) < 256M
CPU消耗 < 1000ms
请严格按要求输出,不要画蛇添足地打印类似:“请您输入...” 的多余内容。
所有代码放在同一个源文件中,调试通过后,拷贝提交该源码。
注意:不要使用package语句。不要使用jdk1.7及以上版本的特性。
注意:主类的名字必须是:Main,否则按无效代码处理。
分析:
蓝盾蚂蚁首先判断蚂蚁所在的格子是白格子还是黑格子可以使用二维数组来模拟,然后在判断蚂蚁的方向(可以用数组来模拟蚂蚁的方向String f[]= {"U","L","D","R"};)定义一个数值i来接收蚂蚁的方向随着数组(例:i=2方向就是D,i=0方向就是U)然后对i的值进行控制向右就是-1,向左就是+1。i的值只能是1-3。判断完之后对当前位置进行数组的值进行改变(1变0,0变1),判断旋转之后的方向,进行对x,y的值进行改变。最后输出x,y的值
import java.util.Scanner;
public class Main{
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner sc = new Scanner(System.in);
int n,m,x,y,k;
//n行
n=sc.nextInt();
// m列
m=sc.nextInt();
// 使用二位数组来模拟
int arr[][]=new int[n][m];
// 进行赋值
for (int i = 0; i < n; i++) {
for (int j = 0; j < m; j++) {
arr[i][j]=sc.nextInt();
}
}
//坐标
x=sc.nextInt();
y=sc.nextInt();
//方向
//U上D下L左R右
String s=sc.next();
// 行走的步数
k=sc.nextInt();
String f[]= {"U","L","D","R"};
//定义方向的初值为-1
int s1=-1;
//判断当前的方向并赋给s1
for (int i = 0; i < f.length; i++) {
if(s.equals(f[i])) {
s1=i;
break;
}
}
// 执行条件:当前步数大于1
while(k>0) {
// 判断当前的格子是白格子还是黑格子 0左转 1右转
// 当前为白格子
if(arr[x][y]==0) {
// 向左转
s1++;
// 保证是1-3之内的数值
s1=s1%4;
// 当前格子为黑格子
arr[x][y]=1;
// 判断旋转后的方向进行x y的位移
if(s1==1) {
y--;
}else if(s1==0){
x--;
}
else if(s1==2){
x++;
}
else if(s1==3){
y++;
}
}else{
// 向右转
s1--;
// 保证是1-3之内的数值
if(s1<0) {
s1=3;
}
// 设置当前格子为白格子
arr[x][y]=0;
// 判断旋转后的方向进行x y的位移
if(s1==1) {
y--;
}else if(s1==0){
x--;
}
else if(s1==2){
x++;
}
else if(s1==3){
y++;
}
}
// 步数减一
k--;
}
// 输出x y的坐标
System.out.println(x+" "+y);
}
}