0pts玄关求调(有Hack我的数据)
查看原帖
0pts玄关求调(有Hack我的数据)
1036180
ChampionCyan楼主2024/5/26 10:49
#include <bits/stdc++.h>
#define ERROR puts("Invalid command")
#define pc putchar(';')
using namespace std;
int a, b, c, d;
int rcx = 0, rcy = 4, bcx = 9, bcy = 4;
bool who = true, is_over = false;

inline void ps(string s) {
	int n = s.length();
	for (int i = 0; i < n; i++)
		putchar(s[i]);
}

string gra[10][9] = {
	{"red car", "red horse", "red elephant", "red guard", "red captain", "red guard", "red elephant", "red horse", "red car"}, 
	{"NA", "NA", "NA", "NA", "NA", "NA", "NA", "NA", "NA"}, 
	{"red duck", "NA", "NA", "NA", "NA", "NA", "NA", "NA", "red duck"}, 
	{"red soldier", "NA", "red soldier", "NA", "red soldier", "NA", "red soldier", "NA", "red soldier"}, 
	{"NA", "NA", "NA", "NA", "NA", "NA", "NA", "NA", "NA"}, 
	{"NA", "NA", "NA", "NA", "NA", "NA", "NA", "NA", "NA"}, 
	{"blue soldier", "NA", "blue soldier", "NA", "blue soldier", "NA", "blue soldier", "NA", "blue soldier"}, 
	{"blue duck", "NA", "NA", "NA", "NA", "NA", "NA", "NA", "blue duck"}, 
	{"NA", "NA", "NA", "NA", "NA", "NA", "NA", "NA", "NA"}, 
	{"blue car", "blue horse", "blue elephant", "blue guard", "blue captain", "blue guard", "blue elephant", "blue horse","blue car"}
};

inline bool isok(int x, int y) {
	return x >= 0 && y >= 0 && x < 10 && y < 9;
}

inline bool can_soldier_go() {
	return abs(a - c) <= 1 && abs(b - d) <= 1;
}

inline bool can_guard_go() {
	return abs(a - c) == 1 && abs(b - d) == 1;
}

inline bool can_captain_go() {
	if ((abs(a - c) == 1 && abs(b - d) == 0) || (abs(a - c) == 0 && abs(b - d) == 1)) {
		if (who)
			rcx = c, rcy = d;
		else
			bcx = c, bcy = d;
		return true;
	}
	return false;
}

inline bool can_car_go() {
	if (a == c) {
		if (b > d) {
			for (int j = b - 1; j > d; j--)
				if (gra[a][j] != "NA")
					return false;
		} else {
			for (int j = b + 1; j < d; j++)
				if (gra[a][j] != "NA")
					return false;
		}
	} else if (b == d) {
		if (a > c) {
			for (int i = a - 1; a > c; i--)
				if (gra[i][b] != "NA")
					return false;
		} else {
			for (int i = a + 1; a < c; i++)
				if (gra[i][b] != "NA")
					return false;
		}
	} else
		return false;
	return true;
}

inline bool can_horse_go() {
	if (abs(a - c) == 2 && abs(b - d) == 1) {
		if (a > c) {
			return gra[a - 1][b] == "NA";
		} else {
			return gra[a + 1][b] == "NA";
		}
	}
	if (abs(a - c) == 1 && abs(b - d) == 2) {
		if (b > d) {
			return gra[a][b - 1] == "NA";
		} else {
			return gra[a][b + 1] == "NA";
		}
	}
	return false;
}

inline bool can_elephant_go() {
	if (abs(a - c) == 2 && abs(b - d) == 2) {
		if (a > c) {
			if (b > d) {
				return gra[a - 1][b - 1] == "NA";
			} else {
				return gra[a - 1][b + 1] == "NA";
			}
		} else {
			if (b > d) {
				return gra[a + 1][b - 1] == "NA";
			} else {
				return gra[a + 1][b + 1] == "NA";
			}
		}
	}
	return false;
}

inline bool can_duck_go() {
	if (abs(a - c) == 3 && abs(b - d) == 2) {
		if (a > c) {
			if (b > d) {
				return gra[a - 2][b - 1] == "NA" && gra[a - 1][b] == "NA";
			} else {
				return gra[a - 2][b + 1] == "NA" && gra[a - 1][b] == "NA";
			}
		} else {
			if (b > d) {
				return gra[a + 2][b - 1] == "NA" && gra[a + 1][b] == "NA";
			} else {
				return gra[a + 2][b + 1] == "NA" && gra[a + 1][b] == "NA";
			}
		}
	}
	if (abs(a - c) == 2 && abs(b - d) == 3) {
		if (b > d) {
			if (a > c) {
				return gra[a - 1][b - 2] == "NA" && gra[a][b - 1] == "NA";
			} else {
				return gra[a + 1][b - 2] == "NA" && gra[a][b - 1] == "NA";
			}
		} else {
			if (a > c) {
				return gra[a - 1][b + 2] == "NA" && gra[a][b + 1] == "NA";
			} else {
				return gra[a + 1][b + 2] == "NA" && gra[a][b + 1] == "NA";
			}
		}
	}
	return false;
}

inline bool can_it_go() {
	if (who) {
		if (gra[a][b] == "red car")
			return can_car_go();
		if (gra[a][b] == "red horse")
			return can_horse_go();
		if (gra[a][b] == "red elephant")
			return can_elephant_go();
		if (gra[a][b] == "red duck")
			return can_duck_go();
		if (gra[a][b] == "red captain")
			return can_captain_go();
		if (gra[a][b] == "red guard")
			return can_guard_go();
		return can_soldier_go();
	} else {
		if (gra[a][b] == "blue car")
			return can_car_go();
		if (gra[a][b] == "blue horse")
			return can_horse_go();
		if (gra[a][b] == "blue elephant")
			return can_elephant_go();
		if (gra[a][b] == "blue duck")
			return can_duck_go();
		if (gra[a][b] == "blue captain")
			return can_captain_go();
		if (gra[a][b] == "blue guard")
			return can_guard_go();
		return can_soldier_go();
	}
}

inline string is_checkmate() {
	int copy_a = a, copy_b = b, copy_c = c, copy_d = d;
	bool copy_who = who;
	for (a = 0; a < 10; a++) {
		for (b = 0; b < 9; b++) {
			if (gra[a][b] != "NA") {
				if (gra[a][b][0] == 'r')
					c = bcx, d = bcy, who = 1;
				else
					c = rcx, d = rcy, who = 0;
				if (can_it_go())
					goto out;
			}
		}
	}
	who = copy_who, a = copy_a, b = copy_b, c = copy_c, d = copy_d;
	return "no";
	out:;
	who = copy_who, a = copy_a, b = copy_b, c = copy_c, d = copy_d;
	return "yes";
}

int main() {
	int Q;
	scanf("%d", &Q);
	while (Q--) {
		scanf("%d%d%d%d", &a, &b, &c, &d);
		if (is_over || 
		!(isok(a, b) && isok(c, d)) || 
		gra[a][b] == "NA" || 
		(gra[a][b][0] == 'r' && (gra[c][d][0] == 'r' || !who)) || 
		(gra[a][b][0] == 'b' && (gra[c][d][0] == 'b' || who))) {
			ERROR;
			continue;
		}
		if (who) {
			if (can_it_go()) {
				ps(gra[a][b]);
				pc;
				ps(gra[c][d]);
				pc;
				if (gra[c][d] == "blue captain")
					is_over = true;
				gra[c][d] = gra[a][b];
				gra[a][b] = "NA";
				ps(is_checkmate());
				pc;
				if (is_over)
					puts("yes");
				else
					puts("no");
			} else {
				ERROR;
				continue;
			}
		} else {
			if (can_it_go()) {
				ps(gra[a][b]);
				pc;
				ps(gra[c][d]);
				pc;
				if (gra[c][d] == "red captain")
					is_over = true;
				gra[c][d] = gra[a][b];
				gra[a][b] = "NA";
				ps(is_checkmate());
				pc;
				if (is_over)
					puts("yes");
				else
					puts("no");
			} else {
				ERROR;
				continue;
			}
		}
		who = !who;
	}
	return 0;
}

求调附赠Hack:

54
3 8 4 7
9 2 7 4
3 6 4 5
9 1 8 3
0 7 2 6
6 2 5 3
3 2 4 3
8 3 6 2
4 3 5 3
6 4 5 3
3 4 4 4
5 3 4 2
3 0 4 0
9 0 9 1
0 2 2 4
9 1 2 1
4 7 4 6
6 8 5 8
4 5 5 5
6 6 5 6
4 6 5 6
7 8 5 5
5 6 5 5
5 8 4 8
2 6 3 4
4 2 3 2
0 1 1 3
3 2 2 3
1 3 2 1
2 3 2 4
0 6 2 4
4 8 3 8
2 8 4 5
3 8 2 7
0 8 9 8
9 7 7 6
5 5 6 5
7 6 5 7
4 5 7 7
9 4 8 4
9 8 8 8
8 4 9 4
8 8 8 4
9 4 8 4
6 5 7 4
9 6 7 4
4 4 5 3
2 7 2 6
5 3 6 2
2 6 1 5
6 2 7 3
1 5 0 4
7 3 8 4
1 2 6 7
2024/5/26 10:49
加载中...