算法竞赛入门第二版 4-1

#include <cstdio>
#include <algorithm>
using namespace std;
char Lu, red[8][8];
int black[8][8], Hui[8][2];
int n, x, y, a, b, mark,w,e;
int main(){
	while (scanf("%d", &n)){
		int flag = 0, e = 0;
		memset(red, 0, sizeof(red));
		memset(black, 0, sizeof(black));
		memset(Hui, 0, sizeof(Hui));
		scanf("%d%d", &a, &b);
		black[a][b] = 1;
		for (int i = 1; i <= n; i++){
			scanf("%c%d%d", &Lu, &x, &y);
			Hui[i][1] = x, Hui[i][2] = y;
			red[x][y] = Lu;
		}
		for (int i = -1; i <= 1; i++){
			for (int j = -1; j <= 1; j++){
				int dx = a + i, dy = b + j;
				if (dx >= 1 && dx <= n && dy >= 1 && dy <= n && black[dx][dy] == 0 && red[dx][dy] == 0){
					w = 0;
					e++;
					if (w)
						break;
					for (int k = 1; k <= n; k++){
						if (red[Hui[k][1]][Hui[k][2]] == 'G'){
							mark = 0;
							if (Hui[k][1] == dx){
								if (dy < Hui[k][2]){
									int temp = dy;
									dy = Hui[k][2];
									Hui[k][2] = temp;
								}
								for (int q = Hui[k][2] + 1; q < dy; q++)
									if (red[dx][q] == 0)
										mark++;
								if (mark == dy - Hui[k][2] - 1){
									flag++;
									w = 1;
								}
							}
							if (Hui[k][2] == dy){
								if (dx < Hui[k][1]){
									int temp = dx;
									dx = Hui[k][1];
									Hui[k][1] = temp;
								}
								for (int q = Hui[k][1] + 1; q < dx; q++)
									if (red[q][dy] == 0)
										mark++;
								if (mark == dx - Hui[k][1] - 1){
									flag++;
									w = 1;
								}
							}
						}
						if (red[Hui[k][1]][Hui[k][2]] == 'R'){
							mark = 0;
							if (Hui[k][1] == dx){
								if (dy < Hui[k][2]){
									int temp = dy;
									dy = Hui[k][2];
									Hui[k][2] = temp;
								}
								for (int q = Hui[k][2] + 1; q < dy; q++)
									if (red[dx][q] == 0)
										mark++;
								if (mark == dy - Hui[k][2] - 1){
									flag++;
									w = 1;
								}
							}
							if (Hui[k][2] == dy){
								if (dx < Hui[k][1]){
									int temp = dx;
									dx = Hui[k][1];
									Hui[k][1] = temp;
								}
								for (int q = Hui[k][1] + 1; q < dx; q++)
									if (red[q][dy] == 0)
										mark++;
								if (mark == dx - Hui[k][1] - 1){
									flag++;
									w = 1;
								}
							}
						}
						if (red[Hui[k][1]][Hui[k][2]] == 'C'){
							mark = 0;
							if (Hui[k][1] == dx){
								if (dy < Hui[k][2]){
									int temp = dy;
									dy = Hui[k][2];
									Hui[k][2] = temp;
								}
								for (int q = Hui[k][2] + 1; q < dy; q++)
									if (red[dx][q] == 0)
										mark++;
								if (mark == dy - Hui[k][2] - 2){
									flag++;
									w = 1;
								}
							}
							if (Hui[k][2] == dy){
								if (dx < Hui[k][1]){
									int temp = dx;
									dx = Hui[k][1];
									Hui[k][1] = temp;
								}
								for (int q = Hui[k][1] + 1; q < dx; q++)
									if (red[q][dy] == 0)
										mark++;
								if (mark == dx - Hui[k][1] - 2){
									flag++;
									w = 1;
								}
							}
						}
						if (red[Hui[k][1]][Hui[k][2]] == 'H'){
							if (dx == Hui[k][1] + 2 && (dy == Hui[k][2] + 1 || dy == Hui[k][2] - 1) && red[Hui[k][1] + 1][Hui[k][2]] == 0){
								flag++;
								w = 1;
							}
							if (dx == Hui[k][1] - 2 && (dy == Hui[k][2] + 1 || dy == Hui[k][2] - 1) && red[Hui[k][1] - 1][Hui[k][2]] == 0){
								flag++;
								w = 1;
							}
							if (dy == Hui[k][2] + 2 && (dx == Hui[k][1] + 1 || dx == Hui[k][1] - 1) && red[Hui[k][2] + 1][Hui[k][1]] == 0){
								flag++;
								w = 1;
							}
							if (dy == Hui[k][2] - 2 && (dx == Hui[k][1] + 1 || dx == Hui[k][1] - 1) && red[Hui[k][2] - 1][Hui[k][1]] == 0){
								flag++;
								w = 1;
							}
						}
					}
				}
			}
		}
		if (flag == e)
			printf("yes\n");
		else
			printf("no\n");
	}
	return 0;
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值