兰顿蚂蚁
Posted mabeytang
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了兰顿蚂蚁相关的知识,希望对你有一定的参考价值。
问题描述
兰顿蚂蚁,是于1986年,由克里斯·兰顿提出来的,属于细胞自动机的一种。
平面上的正方形格子被填上黑色或白色。在其中一格正方形内有一只“蚂蚁”。
蚂蚁的头部朝向为:上下左右其中一方。
蚂蚁的移动规则十分简单:
若蚂蚁在黑格,右转90度,将该格改为白格,并向前移一格;
若蚂蚁在白格,左转90度,将该格改为黑格,并向前移一格。
规则虽然简单,蚂蚁的行为却十分复杂。刚刚开始时留下的路线都会有接近对称,像是会重复,但不论起始状态如何,蚂蚁经过漫长的混乱活动后,会开辟出一条规则的“高速公路”。
蚂蚁的路线是很难事先预测的。
你的任务是根据初始状态,用计算机模拟兰顿蚂蚁在第n步行走后所处的位置。
输入格式
输入数据的第一行是 m n 两个整数(3 < m, n < 100),表示正方形格子的行数和列数。
接下来是 m 行数据。
每行数据为 n 个被空格分开的数字。0 表示白格,1 表示黑格。
接下来是一行数据:x y s k, 其中x y为整数,表示蚂蚁所在行号和列号(行号从上到下增长,列号从左到右增长,都是从0开始编号)。s 是一个大写字母,表示蚂蚁头的朝向,我们约定:上下左右分别用:UDLR表示。k 表示蚂蚁走的步数。
接下来是 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
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 0
1 1 1
1 1 1
1 1 U 6
样例输出
0 0
Algorithm
题目一上来就看见一个:细胞自动机,让我想到了以前用过的有限自动机。
但是最终我决定我的算法的还是这句话:
因为难以预测,所以最好的算法就是模拟,我没有了解过是否有数学公式可以描述,百度百科是这样讲的:
这里我使用递归进行模拟。
AC
1 /* 2 * 目前来看是一个模拟的题目... 3 */ 4 #include<iostream> 5 #include<cstring> 6 #include<map> 7 #include<cstdio> 8 9 using namespace std; 10 11 int m, n, x, y, k; 12 char s; 13 int a[101][101]; 14 char w[4] = {‘U‘, ‘R‘, ‘D‘, ‘L‘}; 15 map<char, int> lr; 16 17 void move(int x, int y, char s, int k) 18 { 19 if(k == 0){ 20 cout<<x<<" "<<y<<‘ ‘; 21 return; 22 } 23 if(a[x][y]){ // 黑 24 s = w[(lr[s]+1)%4]; 25 a[x][y] = 0; 26 } 27 else{ 28 s = (lr[s] == 0)?‘L‘:w[(lr[s]-1)%4]; 29 a[x][y] = 1; 30 } 31 switch(s) 32 { 33 case ‘U‘:move(x-1, y, s, --k);break; 34 case ‘D‘:move(x+1, y, s, --k);break; 35 case ‘L‘:move(x, y-1, s, --k);break; 36 case ‘R‘:move(x, y+1, s, --k);break; 37 default:break; 38 } 39 return; 40 } 41 42 int main() 43 { 44 lr[‘U‘] = 0; lr[‘R‘] = 1; 45 lr[‘D‘] = 2; lr[‘L‘] = 3; 46 m = n = 0; 47 while(cin>>m>>n) 48 { 49 memset(a, 0, sizeof(a)); 50 for(int i=0;i<m;i++) 51 for(int j=0;j<n;j++){ 52 cin>>a[i][j]; 53 } 54 k = x = y = 0; 55 cin>>x>>y>>s>>k; 56 move(x, y, s, k); 57 } 58 59 return 0; 60 }
2019-02-09
19:07:35
以上是关于兰顿蚂蚁的主要内容,如果未能解决你的问题,请参考以下文章