题目描述
两只牛逃跑到了森林里。Farmer John 开始用他的专家技术追捕这两头牛。你的任务是模拟他们的行为(牛和 John)。
追击在 10 \times 1010×10 的平面网格内进行。一个格子可以是:一个障碍物,两头牛(它们总在一起),或者 Farmer John。两头牛和 Farmer John 可以在同一个格子内(当他们相遇时),但是他们都不能进入有障碍的格子。
一个格子可以是:
-
.
空地; -
*
障碍物; -
C
两头牛; -
F
Farmer John。
这里有一个地图的例子:
*...*.....
......*...
...*...*..
..........
...*.F....
*.....*...
...*......
..C......*
...*.*....
.*.*......
牛在地图里以固定的方式游荡。每分钟,它们可以向前移动或是转弯。如果前方无障碍(地图边沿也是障碍),它们会按照原来的方向前进一步。否则它们会用这一分钟顺时针转 90 度。 同时,它们不会离开地图。
Farmer John 深知牛的移动方法,他也这么移动。
每次(每分钟)Farmer John 和两头牛的移动是同时的。如果他们在移动的时候穿过对方,但是没有在同一格相遇,我们不认为他们相遇了。当他们在某分钟末在某格子相遇,那么追捕结束。
读入十行表示地图。每行都只包含 10 个字符,表示的含义和上面所说的相同。保证地图中只有一个 F
和一个 C
。F
和 C
一开始不会处于同一个格子中。
计算 Farmer John 需要多少分钟来抓住他的牛,假设牛和 Farmer John 一开始的行动方向都是正北(即上)。 如果 John 和牛永远不会相遇,输出 0。
输入格式
输入共十行,每行 10 个字符,表示如上文描述的地图。
输出格式
输出一个数字,表示 John 需要多少时间才能抓住牛们。如果 John 无法抓住牛,则输出 0。
输入输出样例
输入 #1复制
*...*..... ......*... ...*...*.. .......... ...*.F.... *.....*... ...*...... ..C......* ...*.*.... .*.*......
输出 #1复制
49
说明/提示
翻译来自NOCOW
USACO 2.4
做法暴力枚举,困难点就是如何判断结束,找重复的情况,因为数据不大,10*10,所以奶牛和农夫各400种请况,因此根据乘法原理,如果分钟数超过160000就不可能找得到了
#include<bits/stdc++.h>
using namespace std;
char arr[12][12];
int cx , cy , fx , fy;
int main(){
for(int i = 1 ; i <= 10 ; i++ ){
for(int j = 1 ; j <= 10 ; j++) {
cin >> arr[i][j];
if(arr[i][j] == 'F') fx = i , fy = j;
if(arr[i][j] == 'C') cx = i , cy = j;
}
}
for(int i = 0 ; i <= 11 ; i++) arr[0][i] = arr[11][i] = arr[i][0] = arr[i][11] = '*';
int ans , flagc = 1 , flagf = 1;
for(ans = 0 ; !(cx == fx && cy == fy) && ans <= 100000 ; ans++){
if(flagc == 1){
if(arr[cx - 1][cy] == '*') flagc++;
else cx--;
}
else if(flagc == 2){
if(arr[cx][cy + 1] == '*') flagc = 3;
else cy++;
}
else if(flagc == 3){
if(arr[cx + 1][cy] == '*') flagc = 4;
else cx++;
}
else if(flagc == 4) {
if(arr[cx][cy - 1] == '*') flagc = 1;
else cy--;
}
if(flagf == 1){
if(arr[fx - 1][fy] == '*') flagf = 2;
else fx--;
}
else if(flagf == 2){
if(arr[fx][fy + 1] == '*') flagf = 3;
else fy++;
}
else if(flagf == 3){
if(arr[fx + 1][fy] == '*') flagf = 4;
else fx++;
}
else if(flagf == 4) {
if(arr[fx][fy - 1] == '*') flagf = 1;
else fy--;
}
}
if(ans > 10000) cout << 0;
else cout << ans;
return 0;
}