WA on 4,经过FC发现中间会把合法的判断搞成不合法,有没有好心人帮忙调一下
#include <bits/stdc++.h>
#define f(i,j,k) for(int i=j;i<=k;i++)
using namespace std;
int T,flag=0,cur=0;
int fx[4]= {1,1,-1,-1},fy[4]= {1,-1,1,-1},a[6]= {0,1,2,1,0,3},b[6]= {1,1,2,2,0,2};
int s[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}
};//1 blue 2 red
int board[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}
};
inline void print(int x) {
if(cur) printf("blue ");
else printf("red ");
if (x==1) printf("captain;");
else if (x==2) printf("guard;");
else if (x==3) printf("elephant;");
else if (x==4) printf("horse;");
else if (x==5) printf("car;");
else if (x==6) printf("duck;");
else if (x==7) printf("soldier;");
}
inline int move(int f,int ax,int ay,int bx,int by) {
int minn=min(a[f],b[f])-(a[f]==b[f]);
f(i,0,3){
int x=ax+a[f]*fx[i],y=ay+b[f]*fy[i],flag=0;
if (x<0||x>9||y<0||y>8) continue;
if (x==bx&&y==by) {
f(j,1,minn&&!flag) if (board[x-j*fx[i]][y-j*fy[i]]) flag=1;
if (!flag) return 1;
}
}
f(i,0,3){
int x=ax+b[f]*fx[i],y=ay+a[f]*fy[i],flag=0;
if (x<0||x>9||y<0||y>8) continue;
if (x==bx&&y==by) {
f(j,1,minn&&!flag) if (board[x-j*fx[i]][y-j*fy[i]]) flag=1;
if (!flag) return 1;
}
}
return 0;
}
inline int chk(int ax,int ay,int bx,int by) {
if (flag||ax<0||ax>9||ay<0||ay>8||bx<0||bx>9||by<0||by>8) return 1;
if(board[ax][ay]==5) {
int ax=min(ax,bx),bx=max(ax,bx),ay=min(ay,by),by=max(ay,by);
if (ax!=bx&&ay!=by) return 1;
if (ax==bx){f(i,ay+1,by-1) if(board[ax][i]) return 1;}
else{f(i,ax+1,bx-1) if (board[i][ay]) return 1;}
return 0;
}else if(board[ax][ay]==7) return !(move(0,ax,ay,bx,by)||move(1,ax,ay,bx,by));
else return (!move(board[ax][ay]-1,ax,ay,bx,by));
}
inline int gg(){
int cnt=0;
f(i,0,9) f(j,0,8) if (board[i][j]==1) cnt++;
return cnt<2;
}
inline int j(int f) {
int x=0,y=0;
for (int i=0; !x&&i<10; i++) for(int j=0; !x&&j<9; j++) if(board[i][j]==1&&s[i][j]==f) x=i,y=j;
f(i,0,9) f(j,0,8) if (board[i][j]&&s[i][j]!=f) if(!chk(i,j,x,y)) return 1;
return 0;
}
int main() {
//freopen("test4.in","r",stdin);
//freopen("test4.out","w",stdout);
scanf("%d",&T);
f(i,0,T-1){
int x1,x2,y1,y2;
scanf("%d%d%d%d",&x1,&y1,&x2,&y2);
if (chk(x1,y1,x2,y2)||((cur+1)!=s[x1][y1])||((cur+1)==s[x2][y2])) {printf("Invalid command\n");continue;}
print(board[x1][y1]),cur^=1;//moved
if (s[x2][y2]) print(board[x2][y2]);
else printf("NA;");//killed
s[x2][y2]=s[x1][y1],board[x2][y2]=board[x1][y1],s[x1][y1]=board[x1][y1]=0;
if (gg()) flag=1;
if(j(1)||j(2)) printf("yes;");
else printf("no;");//gg
if(flag) printf("yes\n");
else printf("no\n");//over
}
return 0;
}