USACO2.4.1 The Tamworth Two (ttwo)

如果初始时两人四周都有墙则直接输出0。
然后开始模拟。如果两人都回到了出发点则输出0。
还有就是如果两人都走了很多步就认为无法相遇输出0。

否则如果途中相遇了就输出。

/*
ID:shijiey1
PROG:ttwo
LANG:C++
*/
#include <cstdio>
#include <cstring>
#include <algorithm>

using namespace std;

struct Point{
	int x, y;
};

int arr[12][12];
Point john;
Point cow;
Point posj;
Point posc;
Point sj;
Point sc;
int main() {
	freopen("ttwo.in", "r", stdin);
	freopen("ttwo.out", "w", stdout);
	char c;
	for (int i = 0; i <= 11; i++) {
		arr[0][i] = arr[i][0] = 1;
		arr[11][i] = arr[i][11] = 1;
	}
	for (int i = 1; i <= 10; i++) {
		for (int j = 1; j <= 10; j++) {
			scanf("%c", &c);
			if (c == '*') arr[i][j] = 1;
			if (c == 'F') {
				john.x = sj.x = i;
				john.y = sj.y = j;
			}
			if (c == 'C') {
				cow.x = sc.x = i;
				cow.y = sc.y = j;
			}
		}
		getchar();
	}
	posj.x = posc.x = -1;
	posj.y = posc.y = 0;

	if (arr[john.x + 1][john.y] && arr[john.x - 1][john.y] && arr[john.x][john.y + 1] && arr[john.x][john.y - 1]
		|| arr[cow.x + 1][cow.y] && arr[cow.x - 1][cow.y] && arr[cow.x][cow.y + 1] && arr[cow.x][cow.y - 1]) {
		printf("0\n");
		return 0;
	}

	int cnt = 0;
	while (true) {
		// printf("%d %d | %d %d\n", john.x, john.y, cow.x, cow.y);
		if (cnt > 2000000) {
			printf("0\n");
			return 0;
		}
		if (arr[john.x + posj.x][john.y + posj.y] == 1) {
			int t = posj.y;
			if (!posj.x) posj.y = 0;
			else posj.y = posj.y - posj.x;
			posj.x = t;
		} else {
			john.x += posj.x;
			john.y += posj.y;
		}
		
		if (arr[cow.x + posc.x][cow.y + posc.y] == 1) {
			int t = posc.y;
			if (!posc.x) posc.y = 0;
			else posc.y = posc.y - posc.x;
			posc.x = t;
		} else {
			cow.x += posc.x;
			cow.y += posc.y;
		}
		
		if (john.x == cow.x && john.y == cow.y) {
			printf("%d\n", cnt + 1);
			return 0;
		}
		cnt++;
	}


	return 0;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值