很有意思的一道模拟题,之前其实看过挺多次的,都因为没思路或者觉得难写没动.今天静下心仔细研究下,总算是A掉了.
这道题我遇到的坑点还是不少的,如果完全靠自己做结果应该是个未知数,
- 之前影响我对这道题难度判断的地方就是边界检查和无解判断.边界检查这个多做点题还是有经验了的,就是把地图开大点,地图边界算作障碍物,就可以省去比较繁琐的越界检查.
即便如此我还是因为少开了一行一列而被迫debug.无解判断偷摸看了题解,有哈希和数组两种判断法,我开了个三维数组来作判断.农夫在同一个方向进入同一格的次数过多,将被判断为无解.然后我因为这个次数开的太少wa了两个点再次被迫花5秒debug - 写代码的时候横纵坐标没打注释,把自己整不会了,样例输出的答案少了3.判断出问题还是蛮快的,但改代码因为没写注释懵逼了半天.本来以为要对结构动刀,仔细捋明白之后改了个方向就成了…
#include <bits/stdc++.h>
using namespace std;
const int N = 10;
char m[12][12];
int movex[4] = {-1,0,1,0};
int movey[4] = {0,1,0,-1};
pair<int,int> f,c;
int fm,cm;
int flag[4][12][12];
int ans;
int main()
{
memset(m,'*',sizeof m);
for(int i = 1 ; i <= N ; i++)
for(int j = 1 ; j <= N ; j++)
{
cin >> m[i][j];
if(m[i][j] == 'F')
f = make_pair(i,j);
else if(m[i][j] == 'C')
c = make_pair(i,j);
}
while(1)
{
ans++;
if(m[f.first + movex[fm]][f.second + movey[fm]] != '*')
{
f.first += movex[fm];
f.second += movey[fm];
flag[fm][f.first][f.second]++;
}
else
fm = (fm + 1) % 4;
if(m[c.first + movex[cm]][c.second + movey[cm]] != '*')
{
c.first += movex[cm];
c.second += movey[cm];
}
else
cm = (cm + 1) % 4;
if(f == c)
{
cout << ans;
break;
}
if(flag[fm][f.first][f.second] > 50)
{
cout << 0;
break;
}
}
return 0;
}
|