duckchess球调
查看原帖
duckchess球调
372622
lelml楼主2023/5/7 23:08

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;
}
2023/5/7 23:08
加载中...