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";
}
}