大模拟蒟蒻求调||玄关
查看原帖
大模拟蒟蒻求调||玄关
555617
Targanzqq楼主2024/7/28 11:28

rt,只有样例过了

#include<bits/stdc++.h>
#define int long long
using namespace std;

struct chess{
    string camp;
	string kind;
}c[15][15],none;

int m;
int game_over;
int rcap_x,rcap_y,bcap_x,bcap_y;

void fst(){
	c[0][0].kind="car";c[0][8].kind="car";
	c[9][0].kind="car";c[9][8].kind="car";
	c[0][1].kind="horse";c[0][7].kind="horse";
	c[9][1].kind="horse";c[9][7].kind="horse";
	c[0][2].kind="elephant";c[0][6].kind="elephant";
	c[9][2].kind="elephant";c[9][6].kind="elephant";
	c[0][3].kind="guard";c[0][5].kind="guard";
	c[9][3].kind="guard";c[9][5].kind="guard";
	c[0][4].kind="captain";c[9][4].kind="captain";
	for(int i=0;i<9;i++){
		c[0][i].camp="red";
		c[9][i].camp="blue";
		if(i%2==0){
			c[3][i].kind="soldier";
			c[6][i].kind="soldier";
			c[3][i].camp="red";
			c[6][i].camp="blue";
		}
	}
	c[2][0].camp="red";c[2][0].kind="duck";
	c[2][8].camp="red";c[2][8].kind="duck";
	c[7][0].camp="blue";c[7][0].kind="duck";
	c[7][8].camp="blue";c[7][8].kind="duck";
	rcap_x=0;rcap_y=4;bcap_x=9;bcap_y=4;
}

int judge(string kd,int x,int y,int xx,int yy){
	if(c[xx][yy].camp==c[x][y].camp)return 0;
	if(kd=="captain"){
		if(abs(xx-x)+abs(yy-y)!=1)return 0;
	}
	if(kd=="car"){
		if(xx!=x&&yy!=y)return 0;
		if(xx==x){
			for(int i=min(yy,y);i<=max(yy,y);i++){
				if(i==y||i==yy)continue;
				if(c[x][i].camp!="none")return 0;
			}
		}
		if(yy==y){
			for(int i=min(xx,x);i<=max(xx,x);i++){
				if(i==x||i==xx)continue;
				if(c[i][y].kind!="none")return 0;
			}
		}
	}
	if(kd=="horse"){
		int delx=xx-x,dely=yy-y;
		if(!(abs(delx)==1&&abs(dely)==2||abs(delx)==2&&abs(dely)==1))return 0;
		if(delx==2&&c[x+1][y].kind!="none")return 0;
		if(delx==-2&&c[x-1][y].kind!="none")return 0;
		if(dely==2&&c[x][y+1].kind!="none")return 0;
		if(dely==-2&&c[x][y-1].kind!="none")return 0;
	}
	if(kd=="elephant"){
		int delx=xx-x,dely=yy-y;
		int toy;if(dely>0)toy=1;else toy=-1;
		int tox;if(delx>0)tox=1;else tox=-1;
		if(abs(delx)!=2||abs(dely)!=2)return 0;
		if(delx==2&&c[x+1][y+toy].kind!="none")return 0;
		if(delx==-2&&c[x-1][y+toy].kind!="none")return 0;
	}
	if(kd=="guard"){
		int delx=xx-x,dely=yy-y;
		if(abs(delx)!=1||abs(dely)!=1)return 0;
	}
	if(kd=="soldier"){
		int delx=xx-x,dely=yy-y;
		if(abs(delx)>1||abs(dely)>1)return 0;
	}
	if(kd=="duck"){
		int delx=xx-x,dely=yy-y;
		int toy;if(dely>0)toy=1;else toy=-1;
		int tox;if(delx>0)tox=1;else tox=-1;
		if(!(abs(delx)==3&&abs(dely)==2||abs(delx)==2&&abs(dely)==3))return 0;
		if(delx==3&&(c[x+1][y].kind!="none"||c[x+2][y+toy].kind!="none"))return 0;
		if(delx==-3&&(c[x-1][y].kind!="none"||c[x-2][y+toy].kind!="none"))return 0;
		if(dely==3&&(c[x][y+1].kind!="none"||c[x+tox][y+2].kind!="none"))return 0;
		if(dely==-3&&(c[x][y-1].kind!="none"||c[x+tox][y-2].kind!="none"))return 0;
	}
	return 1;
}

void move(int x,int y,int xx,int yy){
	cout<<c[x][y].camp<<" "<<c[x][y].kind<<";";
	if(c[xx][yy].camp!="none")cout<<c[xx][yy].camp<<" "<<c[xx][yy].kind<<";";
	else cout<<"NA;";
	if(c[xx][yy].kind=="captain"){
		cout<<"no;yes;";game_over=1;return;
	}
	if(c[x][y].kind=="captain"){
		if(c[x][y].camp=="red")rcap_x=xx,rcap_y=yy;
		if(c[x][y].camp=="blue")bcap_x=xx,bcap_y=yy;
	} 
	c[xx][yy].camp=c[x][y].camp;c[xx][yy].kind=c[x][y].kind;
	c[x][y]=none;
	for(int i=0;i<10;i++){
		for(int j=0;j<9;j++){
			if(c[i][j].kind!="none"){
				if(judge(c[i][j].kind,i,j,rcap_x,rcap_y)){
					cout<<"yes;";goto nxt;
				}
				else if(judge(c[i][j].kind,i,j,bcap_x,bcap_y)) {
					cout<<"yes;";goto nxt;
				}
			}
		}
	}
	cout<<"no;";
	nxt:
	cout<<"no;";
} 

int find(int x,int y,int xx,int yy){
	string kd=c[x][y].kind;
	if(!judge(kd,x,y,xx,yy)){
		cout<<"Invalid command";return 0;
	}
	move(x,y,xx,yy);
	return 1;
}

signed main(){
	ios::sync_with_stdio(false);
	cin>>m;
	none.camp="none";
	none.kind="none";
	for(int i=0;i<10;i++){
		for(int j=0;j<9;j++){
			c[i][j]=none;
		}
	}
	fst();
	string now="red";
	for(int i=1;i<=m;i++){
		int x,y,xx,yy;
		cin>>x>>y>>xx>>yy;
		int fl=1;
		if(c[x][y].camp!=now)cout<<"Invalid command",fl=0;
		else if(game_over)cout<<"Invalid command",fl=0;
		else fl=find(x,y,xx,yy);
		if(fl&&now=="red")now="blue";
		else if(fl&&now=="blue")now="red"; 
		cout<<"\n";
	}
}
2024/7/28 11:28
加载中...