十万火急!#2,#3,#4 WA 了
查看原帖
十万火急!#2,#3,#4 WA 了
364991
xler0915楼主2022/2/20 19:20

RT

#include <bits/stdc++.h>
using namespace std;
// no 0
// captain 1
// guard 2
// elephant 3
// horse 4
// car 5
// duck 6
// soldier 7
int chess[10][9] = {
	{5, 4, 3, 2, 1, 2, 3, 4, 5},
	{0, 0, 0, 0, 0, 0, 0, 0, 0},
	{6, 0, 0, 0, 0, 0, 0, 0, 6},
	{7, 0, 7, 0, 7, 0, 7, 0, 7},
	{0, 0, 0, 0, 0, 0, 0, 0, 0},
	{0, 0, 0, 0, 0, 0, 0, 0, 0},
	{7, 0, 7, 0, 7, 0, 7, 0, 7},
	{6, 0, 0, 0, 0, 0, 0, 0, 6},
	{0, 0, 0, 0, 0, 0, 0, 0, 0},
	{5, 4, 3, 2, 1, 2, 3, 4, 5}
};
// no 0
// red 1
// blue 2
int color[10][9] = {
	{1, 1, 1, 1, 1, 1, 1, 1, 1},
	{0, 0, 0, 0, 0, 0, 0, 0, 0},
	{1, 0, 0, 0, 0, 0, 0, 0, 1},
	{1, 0, 1, 0, 1, 0, 1, 0, 1},
	{0, 0, 0, 0, 0, 0, 0, 0, 0},
	{0, 0, 0, 0, 0, 0, 0, 0, 0},
	{2, 0, 2, 0, 2, 0, 2, 0, 2},
	{2, 0, 0, 0, 0, 0, 0, 0, 2},
	{0, 0, 0, 0, 0, 0, 0, 0, 0},
	{2, 2, 2, 2, 2, 2, 2, 2, 2}
};
const int dxCaptain[4] = {1, 0, 0, -1}, dyCaptain[4] = {0, 1, -1, 0};
const int dxGuard[4] = {1, 1, -1, -1}, dyGuard[4] = {1, -1, 1, -1};
const int dxElephant[4] = {2, 2, -2, -2}, dyElephant[4] = {2, -2, 2, -2},
          dxNotMoveElephant[4] = {1, 1, -1, -1}, dyNotMoveElephant[4] = {1, -1, 1, -1};
const int dxHorse[8] = {2, 2, 1, 1, -1, -1, -2, -2}, dyHorse[8] = {1, -1, 2, -2, 2, -2, 1, -1},
          dxNotMoveHorse[8] = {1, 1, 0, 0, 0, 0, -1, -1}, dyNotMoveHorse[8] = {0, 0, 1, -1, 1, -1, 0, 0};
const int dxDuck[8] = {3, 3, 2, 2, -2, -2, -3, -3}, dyDuck[8] = {2, -2, 3, -3, 3, -3, 2, -2},
          dxNotMoveDuck1[8] = {2, 2, 1, 1, -1, -1, -2, -2}, dyNotMoveDuck1[8] = {1, -1, 2, -2, 2, -2, 1, -1},
          dxNotMoveDuck2[8] = {1, 1, 0, 0, 0, 0, -1, -1}, dyNotMoveDuck2[8] = {0, 0, 1, -1, 1, -1, 0, 0};
const int dxSoldier[8] = {1, 1, 1, 0, 0, -1, -1, -1}, dySoldier[8] = {1, 0, -1, 1, -1, 1, 0, -1};
bool finished = false;
int player = 1;
// 1:red
// 2:blue
bool canMove(int x0, int y0, int x1, int y1) {
	if(chess[x0][y0] == 0)
		return false;
	if(color[x0][y0] != player)
		return false;
	if(chess[x0][y0] == 1) {
		for(int i = 0; i < 4; i++) {
			int nx = x0 + dxCaptain[i], ny = y0 + dyCaptain[i];
			if(nx == x1 && ny == y1) {
				if(chess[x1][y1] != 0) {
					if(color[x1][y1] == player)
						return false;
				}
				return true;
			}
		}
		return false;
	} else if(chess[x0][y0] == 2) {
		for(int i = 0; i < 4; i++) {
			int nx = x0 + dxGuard[i], ny = y0 + dyGuard[i];
			if(nx == x1 && ny == y1) {
				if(chess[x1][y1] != 0) {
					if(color[x1][y1] == player)
						return false;
				}
				return true;
			}
		}
		return false;
	} else if(chess[x0][y0] == 3) {
		for(int i = 0; i < 4; i++) {
			int nx = x0 + dxElephant[i], ny = y0 + dyElephant[i];
			if(nx == x1 && ny == y1) {
				if(chess[x0 + dxNotMoveElephant[i]][y0 + dyNotMoveElephant[i]] != 0)
					return false;
				if(chess[x1][y1] != 0) {
					if(color[x1][y1] == player)
						return false;
				}
				return true;
			}
		}
		return false;
	} else if(chess[x0][y0] == 4) {
		for(int i = 0; i < 8; i++) {
			int nx = x0 + dxHorse[i], ny = y0 + dyHorse[i];
			if(nx == x1 && ny == y1) {
				if(chess[x0 + dxNotMoveHorse[i]][y0 + dyNotMoveHorse[i]] != 0)
					return false;
				if(chess[x1][y1] != 0) {
					if(color[x1][y1] == player)
						return false;
				}
				return true;
			}
		}
		return false;
	} else if(chess[x0][y0] == 5) {
		if(x0 == x1) {
			for(int i = min(y0, y1) + 1; i < max(y0, y1); i++) {
				if(chess[x0][i] != 0)
					return false;
			}
			if(chess[x1][y1] != 0) {
				if(color[x1][y1] == player)
					return false;
			}
		} else if(y0 == y1) {
			for(int i = min(x0, x1) + 1; i < max(x0, x1); i++) {
				if(chess[i][y0] != 0)
					return false;
			}
			if(chess[x1][y1] != 0) {
				if(color[x1][y1] == player)
					return false;
			}
		} else
			return false;
		return true;
	} else if(chess[x0][y0] == 6) {
		for(int i = 0; i < 8; i++) {
			int nx = x0 + dxDuck[i], ny = y0 + dyDuck[i];
			if(nx == x1 && ny == y1) {
				if(chess[x0 + dxNotMoveDuck1[i]][y0 + dyNotMoveDuck1[i]] != 0 || chess[x0 + dxNotMoveDuck2[i]][y0 + dyNotMoveDuck2[i]] != 0)
					return false;
				if(chess[x1][y1] != 0) {
					if(color[x1][y1] == player)
						return false;
				}
				return true;
			}
		}
		return false;
	} else {
		for(int i = 0; i < 8; i++) {
			int nx = x0 + dxSoldier[i], ny = y0 + dySoldier[i];
			if(nx == x1 && ny == y1) {
				if(chess[x1][y1] != 0) {
					if(color[x1][y1] == player)
						return false;
				}
				return true;
			}
		}
		return false;
	}
	return true;
}

void move(int x0, int y0, int x1, int y1) {
	if(color[x0][y0] == 1)
		cout << "red ";
	else
		cout << "blue ";
	if(chess[x0][y0] == 1)
		cout << "captain;";
	else if(chess[x0][y0] == 2)
		cout << "guard;";
	else if(chess[x0][y0] == 3)
		cout << "elephant;";
	else if(chess[x0][y0] == 4)
		cout << "horse;";
	else if(chess[x0][y0] == 5)
		cout << "car;";
	else if(chess[x0][y0] == 6)
		cout << "duck;";
	else
		cout << "soldier;";
	if(chess[x1][y1] == 0)
		cout << "NA;";
	else {
		if(color[x1][y1] == 1)
			cout << "red ";
		else
			cout << "blue ";
		if(chess[x1][y1] == 1)
			cout << "captain;";
		else if(chess[x1][y1] == 2)
			cout << "guard;";
		else if(chess[x1][y1] == 3)
			cout << "elephant;";
		else if(chess[x1][y1] == 4)
			cout << "horse;";
		else if(chess[x1][y1] == 5)
			cout << "car;";
		else if(chess[x1][y1] == 6)
			cout << "duck;";
		else
			cout << "soldier;";
	}
	chess[x1][y1] = chess[x0][y0];
	color[x1][y1] = color[x0][y0];
	chess[x0][y0] = color[x0][y0] =  0;
	player = 3 - player;
}

bool findCaptain(int player, int& x, int& y) {
	bool find = false;
	for(int i = 0; i < 10; i++) {
		for(int j = 0; j < 9; j++) {
			if(chess[i][j] == 1 && color[i][j] == player) {
				x = i, y = j;
				find = true;
			}
		}
	}
	return find;
}

bool jiangjun(int player, bool& have) {
	int x = -1, y = -1;
	have = findCaptain(3 - player, x, y);
	if(x != -1 && y != -1) {
		for(int i = 0; i < 10; i++) {
			for(int j = 0; j < 9; j++) {
				if(chess[i][j] == 0)
					continue;
				if(canMove(i, j, x, y))
					return true;
			}
		}
		return false;
	}
	return false;
}

int main() {
	int n;
	cin >> n;
	for(int i = 1; i <= n; i++) {
		int x0, y0, x1, y1;
		cin >> x0 >> y0 >> x1 >> y1;
		if(finished) {
			puts("Invalid command");
		} else {
			if(!canMove(x0, y0, x1, y1))
				puts("Invalid command");
			else {
				move(x0, y0, x1, y1);
				bool have = true;
				if(jiangjun(1, have) == false) {
					if(have == false) {
						cout << "no;yes\n";
						finished = true;
						continue;
					} else {
						cout << "no;no\n";
						continue;
					}
				} else {
					cout << "yes;no\n";
					continue;
				}
				have = true;
				if(jiangjun(2, have) == false) {
					if(have == false) {
						cout << "no;yes\n";
						finished = true;
						continue;
					} else {
						cout << "no;no\n";
						continue;
					}
				} else {
					cout << "yes;no\n";
					continue;
				}
			}
		}
	}
	return 0;
}

2022/2/20 19:20
加载中...