问题描述
给定一个m*n
的矩形,每个格子上有0,1,两种形态,0代表白,1代表黑。
蚂蚁要移动k次,移动规则:
若蚂蚁在黑格,右转90度,将该格改为白格,并向前移一格;
若蚂蚁在白格,左转90度,将该格改为黑格,并向前移一格。
现在给你一个兰顿蚂蚁的位置,和他头的方向,要走的步数,问最后这个蚂蚁会在什么位置停下。
解题思路
除去题目中的移动规则,这道题就是非常简单的模拟题,走k步就可以了,但是因为题目中“简单”的移动规则,导致模拟的情况就非常多。
首先是: 上下左右分别用:UDLR表示。
UDLR 在 0、1上又有不同的转向。
为了方便,我们用借助map来实现他的转弯,具体移动情况可以参考代码部分。
最后要特别注意的一点,每走一步上一个格子需要变颜色
代码部分
#include <cstdio>
#include <cstring>
#include <string>
#include <iostream>
#include <queue>
#include <map>
using namespace std;
typedef pair<char, int> tur; // 拐弯
map <tur, char> cha;//变向
map <char, int> fx; // 具体走向
int dir[4][2] = {-1, 0, 1, 0, 0, -1, 0, 1};
const int maxn = 1e2 + 10;
int mat[maxn][maxn];
int m, n;
int sx, sy, k;
char c;
void init()
{
// 方向
fx['U'] = 0;
fx['D'] = 1;
fx['L'] = 2;
fx['R'] = 3;
//八种转弯情况如下所示,0代表白,1代表黑。
//上下左右分别用:UDLR表示
tur tmp;
tmp.first = 'U', tmp.second = 0;
cha[tmp] = 'L';
tmp.first = 'U', tmp.second = 1;
cha[tmp] = 'R';
tmp.first = 'D', tmp.second = 0;
cha[tmp] = 'R';
tmp.first = 'D', tmp.second = 1;
cha[tmp] = 'L';
tmp.first = 'L', tmp.second = 0;
cha[tmp] = 'D';
tmp.first = 'L', tmp.second = 1;
cha[tmp] = 'U';
tmp.first = 'R', tmp.second = 0;
cha[tmp] = 'U';
tmp.first = 'R', tmp.second = 1;
cha[tmp] = 'D';
}
void dfs(int x, int y, char c, int k)//模拟蚂蚁的移动
{
if(k == 0)
{
cout << x << " " << y << endl;
return;
}
tur tmp;
tmp.first = c;
tmp.second = mat[x][y];
if(mat[x][y] == 1)
mat[x][y] = 0;
else
mat[x][y] = 1;
dfs(dir[fx[cha[tmp]]][0] + x, dir[fx[cha[tmp]]][1] + y, cha[tmp], k - 1);
}
int main()
{
init();
cin >> m >> n;
for(int i = 0; i < m; ++ i)
{
for(int j = 0; j < n; ++ j)
{
cin >> mat[i][j];
}
}
cin >> sx >> sy >> c >> k;
dfs(sx, sy, c, k);
return 0;
}