P1518 [USACO2.4]两只塔姆沃斯牛 The Tamworth Two

题目描述

两只牛逃跑到了森林里。Farmer John 开始用他的专家技术追捕这两头牛。你的任务是模拟他们的行为(牛和 John)。

追击在 10 \times 1010×10 的平面网格内进行。一个格子可以是:一个障碍物,两头牛(它们总在一起),或者 Farmer John。两头牛和 Farmer John 可以在同一个格子内(当他们相遇时),但是他们都不能进入有障碍的格子。

一个格子可以是:

  • . 空地;
  • * 障碍物;
  • C 两头牛;
  • F Farmer John。

这里有一个地图的例子:

*...*.....
......*...
...*...*..
..........
...*.F....
*.....*...
...*......
..C......*
...*.*....
.*.*......

牛在地图里以固定的方式游荡。每分钟,它们可以向前移动或是转弯。如果前方无障碍(地图边沿也是障碍),它们会按照原来的方向前进一步。否则它们会用这一分钟顺时针转 90 度。 同时,它们不会离开地图。

Farmer John 深知牛的移动方法,他也这么移动。

每次(每分钟)Farmer John 和两头牛的移动是同时的。如果他们在移动的时候穿过对方,但是没有在同一格相遇,我们不认为他们相遇了。当他们在某分钟末在某格子相遇,那么追捕结束。

读入十行表示地图。每行都只包含 10 个字符,表示的含义和上面所说的相同。保证地图中只有一个 F 和一个 CF 和 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;
}

上一篇:邮箱基础协议:SMTP/POP3/IMAP


下一篇:2021.5做题记录