[P1518 [USACO2.4] 两只塔姆沃斯牛 The Tamworth Two]的解题思路

发布时间 2023-11-14 21:16:45作者: 拍手称快

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

初始思路

利用数字1~4代表方向;
利用两个循环来实现两个角色的行为,通过每一步break实现两个角色的同步。
由于题目本意是同步,而我这实质上是分步(牛在前Farmer John在后),所以用Farmer John的行为后判别结束条件。

注意

如果用Farmer John的下一步判别结束是不行的,可能牛会撞上Farmer John。
注意判别式在行为语句中的位置。每个行为后都要判断。

#include <iostream>
#include <cmath>
using namespace std;
int time;
int main() {
	char a[11][11];
	int cx, cy, fx, fy;
	for (int y = 1; y <= 10; y++) {
		for (int x = 1; x <= 10; x++) {
			cin >> a[x][y];
			if (a[x][y] == 'C') {
				cx = x;
				cy = y;
				a[x][y] == '.';
			} else if (a[x][y] == 'F') {
				fx = x;
				fy = y;
				a[x][y] == '.';
			}
		}
	}
	int c = 1, f = 1;
	for (int j = 1; ; j++) {
		for (int i = 1; ; i++) {
			if (c == 1) {
				if (a[cx][cy - 1] == '*' || cy == 1) {
					c = 2;
					time++;
					break;
				} else {
					cy--;
					time++;
					break;
				}
			}
			if (c == 2) {
				if (a[cx + 1][cy] == '*' || cx == 10) {
					c = 3;
					time++;
					break;
				} else {
					cx++;
					time++;
					break;
				}
			}
			if (c == 3) {
				if (a[cx][cy + 1] == '*' || cy == 10) {
					c = 4;
					time++;
					break;
				} else {
					cy++;
					time++;
					break;
				}
			}
			if (c == 4) {
				if (a[cx - 1][cy] == '*' || cx == 1) {
					c = 1;
					time++;
					break;
				} else {
					cx--;
					time++;
					break;
				}
			}
		}
		for (int i = 1; ; i++) {
		if (f == 1) {
				if (a[fx][fy - 1] == '*' || fy == 1) {
					f = 2;
					if (fx == cx && cy == fy) {
						cout << time;
						return 0;
					}
					break;
				} else {
					fy--;
					if (fx == cx && cy == fy) {
						cout << time;
						return 0;
					}
					break;
				}
			}
			if (f == 2) {
				if (a[fx + 1][fy] == '*' || fx == 10) {
					f = 3;
					if (fx == cx && cy == fy) {
						cout << time;
						return 0;
					}
					break;
				} else {
					fx++;
					if (fx == cx && cy == fy) {
						cout << time;
						return 0;
					}
					break;
				}
			}
			if (f == 3) {
				if (a[fx][fy + 1] == '*' || fy == 10) {
					f = 4;
					if (fx == cx && cy == fy) {
						cout << time;
						return 0;
					}
					break;
				} else {
					fy++;
					if (fx == cx && cy == fy) {
						cout << time;
						return 0;
					}
					break;
				}
			}
			if (f == 4) {
				if (a[fx - 1][fy] == '*' || fx == 1) {
					f = 1;
				if (fx == cx && cy == fy) {
						cout << time;
						return 0;
					}
					break;
				} else {
					fx--;
					if (fx == cx && cy == fy) {
						cout << time;
						return 0;
					}
					break;
				}
			}
		}
		if (time > 1000000) {
			cout << 0;
			return 0;
		}
	}
	return 0;
}