求助,开O2 RE,关O2 WA on #2
查看原帖
求助,开O2 RE,关O2 WA on #2
523541
Onana_in_XMFLS楼主2024/4/23 14:41
// User:wdy1028
// Problem: P5380 [THUPC2019] 鸭棋
// Contest: Luogu
// URL: https://www.luogu.com.cn/problem/P5380
// Memory Limit: 500 MB
// Time Limit: 1000 ms
// 
// Powered by CP Editor (https://cpeditor.org)

#include <bits/stdc++.h>
typedef long long LL;
typedef unsigned long long ULL;
typedef long double LD;
#define mem(arr,val) memset((arr),(val),(sizeof(arr)))
using namespace std;
int q,xs,ys,xt,yt,s[2] = {1,-1};
char duck[10][9]; //小写为红 大写为蓝 
bool ed = false,now = false;//当前是谁的回合(F表示红方,T表示蓝方)
void init() //初始化
{
	duck[0][0] = 'c'; //红车
	duck[0][1] = 'm'; //红马
	duck[0][2] = 'x'; //红象
	duck[0][3] = 's'; //红士
	duck[0][4] = 'w'; //红王
	duck[0][5] = 's'; //红士
	duck[0][6] = 'x'; //红象
	duck[0][7] = 'm'; //红马
	duck[0][8] = 'c'; //红车
	duck[2][8] = 'y'; //红鸭
	duck[2][0] = 'y'; //红鸭
	duck[3][0] = duck[3][2] = duck[3][4] = duck[3][6] = duck[3][8] = 'b'; //红兵
	duck[9][0] = 'C'; //蓝车
	duck[9][1] = 'M'; //蓝马
	duck[9][2] = 'X'; //蓝象
	duck[9][3] = 'S'; //蓝士
	duck[9][4] = 'W'; //蓝王
	duck[9][5] = 'S'; //蓝士
	duck[9][6] = 'X'; //蓝象
	duck[9][7] = 'M'; //蓝马
	duck[9][8] = 'C'; //蓝车
	duck[7][0] = 'Y'; //蓝鸭
	duck[7][8] = 'Y'; //蓝鸭
	duck[6][0] = duck[6][2] = duck[6][4] = duck[6][6] = duck[6][8] = 'B'; //蓝兵
}
bool captain(int xs,int ys,int xt,int yt) //对于王的合法性判断
{
	if((abs(xs-xt) == 1 && yt == ys) 
	|| (xt == xs && abs(ys-yt) == 1)) return true;
	else return false;
}
bool guard(int xs,int ys,int xt,int yt) //对于士的合法性判断
{
	if(abs(xs-xt) == 1 && abs(ys-yt) == 1) return true;
	else return false;
}
bool soldier(int xs,int ys,int xt,int yt) //对于兵的合法性判断
{
	if((abs(xs-xt) == 1 && yt == ys) 
	|| (xt == xs && abs(ys-yt) == 1)
	|| (abs(xs-xt) == 1 && abs(ys-yt) == 1)) return true;
	else return false;
}
bool car(int xs,int ys,int xt,int yt) //对于车的合法性判断
{
	if(xs != xt && ys != yt) return false;
	if(xs == xt)
	{
		for(int i = ys+1;i <= yt;++i)
			if(isalpha(duck[xs][i])) return false;
		return true;
	}
	if(ys == yt)
	{
		for(int i = xs+1;i <= xt;++i)
			if(isalpha(duck[i][ys])) return false;
		return true;
	}
}
bool elephant(int xs,int ys,int xt,int yt) //对于象的合法性判断
{
	for(int i = 0;i < 2;++i)
		for(int j = 0;j < 2;++j)
		if(!isalpha(duck[xs+s[i]][ys+s[j]]) && xt == xs+s[i]*2 && yt == ys+s[j]*2) return true;
	return false;
}
bool horse(int xs,int ys,int xt,int yt) //对于马的合法性判断
{
	for(int i = 0;i < 2;++i)
		for(int j = 0;j < 2;++j)
		{
			if(!isalpha(duck[xs+s[i]][ys]) && xt == xs+s[i]*2 && yt == ys+s[j]) return true;
			if(!isalpha(duck[xs][ys+s[j]]) && xt == xs+s[i] && yt == ys+s[j]*2) return true;
		}
	return false;
}
bool ducker(int xs,int ys,int xt,int yt) //对于鸭的合法性判断
{
	for(int i = 0;i < 2;++i)
		for(int j = 0;j < 2;++j)
		{
			if(!isalpha(duck[xs+s[i]*2][ys+s[j]]) && !isalpha(duck[xs+s[i]][ys]) && xt == xs+s[i]*3 && yt == ys+s[j]*2) return true;
			if(!isalpha(duck[xs+s[i]][ys+s[j]*2]) && !isalpha(duck[xs][ys+s[j]]) && xt == xs+s[i]*2 && yt == ys+s[i]*3) return true;
		}
	return false;
}
bool judge(bool p,int xs,int ys,int xt,int yt) //合法性判断 p为当前的颜色(0红1蓝)
{
	if(ed) return false;
	if(!p)
	{
		if(!islower(duck[xs][ys]) || islower(duck[xt][yt])) return false;
		if(duck[xs][ys] == 'w') return captain(xs,ys,xt,yt);
		if(duck[xs][ys] == 's') return guard(xs,ys,xt,yt);
		if(duck[xs][ys] == 'x') return elephant(xs,ys,xt,yt);
		if(duck[xs][ys] == 'm') return horse(xs,ys,xt,yt);
		if(duck[xs][ys] == 'c') return car(xs,ys,xt,yt);
		if(duck[xs][ys] == 'y') return ducker(xs,ys,xt,yt);
		if(duck[xs][ys] == 'b') return soldier(xs,ys,xt,yt);
	}
	else
	{
		if(!isupper(duck[xs][ys]) || isupper(duck[xt][yt])) return false;
		if(duck[xs][ys] == 'W') return captain(xs,ys,xt,yt);
		if(duck[xs][ys] == 'S') return guard(xs,ys,xt,yt);
		if(duck[xs][ys] == 'X') return elephant(xs,ys,xt,yt);
		if(duck[xs][ys] == 'M') return horse(xs,ys,xt,yt);
		if(duck[xs][ys] == 'C') return car(xs,ys,xt,yt);
		if(duck[xs][ys] == 'Y') return ducker(xs,ys,xt,yt);
		if(duck[xs][ys] == 'B') return soldier(xs,ys,xt,yt);
	}
}
void get_piece_now(int x,int y) //获取当前位置棋子的信息
{
	if(islower(duck[x][y])) printf("red ");
	else printf("blue ");
	if(duck[x][y] == 'c' || duck[x][y] == 'C') printf("car;");
	if(duck[x][y] == 'm' || duck[x][y] == 'M') printf("horse;");
	if(duck[x][y] == 'x' || duck[x][y] == 'X') printf("elephant;");
	if(duck[x][y] == 's' || duck[x][y] == 'S') printf("guard;");
	if(duck[x][y] == 'w' || duck[x][y] == 'W') printf("captain;");
	if(duck[x][y] == 'y' || duck[x][y] == 'Y') printf("duck;");
	if(duck[x][y] == 'b' || duck[x][y] == 'B') printf("soldier;");
}
bool will_end() //能否形成将军局面 
{
	int xblue,yblue,xred,yred;
	for(int i = 0;i <= 9;++i)
		for(int j = 0;j <= 8;++j)
		{
			if(duck[i][j] == 'W') xblue = i,yblue = j;
			if(duck[i][j] == 'w') xred = i,yred = j;
		}			
	for(int i = 0;i <= 9;++i)
		for(int j = 0;j <= 8;++j)
		{
			if(isupper(duck[i][j]) && judge(1,i,j,xred,yred)) return true;
			if(islower(duck[i][j]) && judge(0,i,j,xblue,yblue)) return true;
		}
} 
bool is_end() //游戏结束了吗
{
	bool blue = false,red = false;
	for(int i = 0;i <= 9;++i)
		for(int j = 0;j <= 8;++j)
		{
			if(duck[i][j] == 'w') red = true;
			if(duck[i][j] == 'W') blue = true;
		}
	return !(red&&blue);
} 
int main(int argc,char *argv[])
{
	init();
	scanf("%d",&q); 
	for(int i = 1;i <= q;++i)
	{
		//if(!now) cout<<"red"<<'\n';
		//else cout<<"blue"<<'\n';
		scanf("%d%d%d%d",&xs,&ys,&xt,&yt);
		if(!judge(now,xs,ys,xt,yt)) {puts("Invalid command");continue;}
		now = !now;
		get_piece_now(xs,ys);
		if(!isalpha(duck[xt][yt])) printf("NA;");
		else get_piece_now(xt,yt);
		duck[xt][yt] = duck[xs][ys];
		if(will_end()) printf("yes;");
		else printf("no;");
		duck[xs][ys] = '0';
		if(is_end()) {printf("yes\n");ed = true;}
		else printf("no\n");
	}
	return 0;
}
2024/4/23 14:41
加载中...