傳送門
最近代碼能力急劇下降,所以開始刷大模擬
這道題坑點很多,細節都在代碼註釋裏了
code:
#include<bits/stdc++.h>
using namespace std;
inline int read(){
register int s=0,f=1;
register char ch=getchar();
while(!isdigit(ch)){if(ch=='-')f*=-1;ch=getchar();}
while(isdigit(ch))s=(s<<1)+(s<<3)+(ch^48),ch=getchar();
return s*f;
}
const int captain[20][5]={
{0,1},{1,0},{0,-1},{-1,0}
};
const int guard[20][5]={
{1,1},{1,-1},{-1,1},{-1,-1}
};
const int elephant[20][5]={
{2,-2},{-2,2},{2,2},{-2,-2}
};
const int Elephant[20][5]={
{1,-1},{-1,1},{1,1},{-1,-1}
};
const int horse[20][5]={
{2,-1},{2,1},{1,2},{-1,2},{-2,1},{-2,-1},{-1,-2},{1,-2}
};
const int Horse[20][5]={
{1,0},{1,0},{0,1},{0,1},{-1,0},{-1,0},{0,-1},{0,-1}
};
const int duck[20][5]={
{3,2},{-3,2},{2,3},{2,-3},{3,-2},{-3,-2},{-2,3},{-2,-3}
};
const int Duck[20][5]={
{1,0},{-1,0},{0,1},{0,-1},{1,0},{-1,0},{0,1},{0,-1},
{2,1},{-2,1},{1,2},{1,-2},{2,-1},{-2,-1},{-1,2},{-1,-2}
};
const int soldier[20][5]={
{0,1},{1,0},{0,-1},{-1,0},{1,1},{-1,-1},{1,-1},{-1,1}
};
//每個子的走法如上
int color,End,flg;
int a[20][20],h[20][20];
string f[10];
void Clean(){
f[1]="captain";f[2]="guard";
f[3]="elephant";f[4]="horse";
f[5]="car";f[6]="duck";f[7]="soldier";//數字對應棋子
a[1][1]=a[1][9]=5,h[1][1]=h[1][9]=1;
a[1][2]=a[1][8]=4,h[1][2]=h[1][8]=1;
a[1][3]=a[1][7]=3,h[1][3]=h[1][7]=1;
a[1][4]=a[1][6]=2,h[1][4]=h[1][6]=1;
a[1][5]=1,h[1][5]=1;
a[3][1]=a[3][9]=6,h[3][1]=h[3][9]=1;
a[4][1]=a[4][3]=a[4][5]=a[4][7]=a[4][9]=7;
h[4][1]=h[4][3]=h[4][5]=h[4][7]=h[4][9]=1;
a[10][1]=a[10][9]=5,h[10][1]=h[10][9]=2;
a[10][2]=a[10][8]=4,h[10][2]=h[10][8]=2;
a[10][3]=a[10][7]=3,h[10][3]=h[10][7]=2;
a[10][4]=a[10][6]=2,h[10][4]=h[10][6]=2;
a[10][5]=1,h[10][5]=2;
a[8][1]=a[8][9]=6,h[8][1]=h[8][9]=2;
a[7][1]=a[7][3]=a[7][5]=a[7][7]=a[7][9]=7;
h[7][1]=h[7][3]=h[7][5]=h[7][7]=h[7][9]=2; //初始化棋盤
}
bool bianjie(int x,int y){//邊界判斷
if(x>=1&&x<=10&&y>=1&&y<=9)return true;
return false;
}
void Jiangjun(int x){//將軍判斷,x表示將哪一方的軍
for(int i=1;i<=10;i++){
for(int j=1;j<=9;j++){
if(h[i][j]==x)continue;//當前點必須是對方的
if(a[i][j]==1){//開始模擬每一個棋子
for(int k=0;k<4;k++){
int tx=i+captain[k][0];
int ty=j+captain[k][1];
if(h[tx][ty]==x&&a[tx][ty]==1){
flg=1;
return;
}
}
}else if(a[i][j]==2){
for(int k=0;k<4;k++){
int tx=i+guard[k][0];
int ty=j+guard[k][1];
if(h[tx][ty]==x&&a[tx][ty]==1){
flg=1;
return;
}
}
}else if(a[i][j]==3){
for(int k=0;k<4;k++){
int tx=i+elephant[k][0];
int ty=j+elephant[k][1];
int px=i+Elephant[k][0];
int py=j+Elephant[k][1];
if(h[px][py])continue;
if(h[tx][ty]==x&&a[tx][ty]==1){
flg=1;
return;
}
}
}else if(a[i][j]==4){
for(int k=0;k<8;k++){
int tx=i+horse[k][0];
int ty=j+horse[k][1];
int px=i+Horse[k][0];
int py=j+Horse[k][1];
if(h[px][py])continue;
if(h[tx][ty]==x&&a[tx][ty]==1){
flg=1;
return;
}
}
}else if(a[i][j]==5){
for(int k=i+1;k<=10;k++){
if(h[k][j]==x&&a[k][j]==1){
flg=1;
return;
}
if(h[k][j])break;
}
for(int k=i-1;k>=1;k--){
if(h[k][j]==x&&a[k][j]==1){
flg=1;
return;
}
if(h[k][j])break;
}
for(int k=j+1;k<=9;k++){
if(h[i][k]==x&&a[i][k]==1){
flg=1;
return;
}
if(h[i][k])break;
}
for(int k=j-1;k>=1;k--){
if(h[i][k]==x&&a[i][k]==1){
flg=1;
return;
}
if(h[i][k])break;
}
}else if(a[i][j]==6){
for(int k=0;k<8;k++){
int tx=i+duck[k][0];
int ty=j+duck[k][1];
int px1=i+Duck[k][0],px2=i+Duck[k+8][0];
int py1=j+Duck[k][1],py2=j+Duck[k+8][1];
if(h[px1][py1]||h[px2][py2])continue;
if(h[tx][ty]==x&&a[tx][ty]==1){
flg=1;
return;
}
}
}else if(a[i][j]==7){
for(int k=0;k<8;k++){
int tx=i+soldier[k][0];
int ty=j+soldier[k][1];
if(h[tx][ty]==x&&a[tx][ty]==1){
flg=1;
return;
}
}
}
}
}
}
void jiangjun(){
Jiangjun(1),Jiangjun(2);//是否將軍
if(flg==1)cout<<"yes;";
else cout<<"no;";
flg=0;//注意清0哦~
}
bool checkcaptain(){
int tot=0;
for(int i=1;i<=10;i++){
for(int j=1;j<=9;j++){
if(a[i][j]==1)tot++;
}
}
return tot==2;
}
void printst(int x,int y){
if(h[x][y]==1)cout<<"red ";
else cout<<"blue ";
cout<<f[a[x][y]]<<";";
}
void check1(int x,int y,int dx,int dy){
for(int i=0;i<4;i++){
int tx=x+captain[i][0];
int ty=y+captain[i][1];//下一個點
if(tx==dx&&ty==dy){
printst(x,y);//輸出當前點
if(h[tx][ty]==2-color%2)printst(tx,ty);//輸出下一個點
else cout<<"NA;";
a[tx][ty]=a[x][y],h[tx][ty]=h[x][y];
a[x][y]=h[x][y]=0;
jiangjun();//判斷是否存在將軍局面
if(checkcaptain())cout<<"no"<<"\n";//判王
else cout<<"yes"<<"\n",End=1;
color++;//注意換成對方走棋
return;
}
}
cout<<"Invalid command"<<"\n";
}
void check2(int x,int y,int dx,int dy){
for(int i=0;i<4;i++){
int tx=x+guard[i][0];
int ty=y+guard[i][1];
if(tx==dx&&ty==dy){
printst(x,y);
if(h[tx][ty]==2-color%2)printst(tx,ty);
else cout<<"NA;";
a[tx][ty]=a[x][y],h[tx][ty]=h[x][y];
a[x][y]=h[x][y]=0;
jiangjun();
if(checkcaptain())cout<<"no"<<"\n";
else cout<<"yes"<<"\n",End=1;
color++;
return;
}
}
cout<<"Invalid command"<<"\n";
}
void check3(int x,int y,int dx,int dy){
for(int i=0;i<4;i++){
int tx=x+elephant[i][0];
int ty=y+elephant[i][1];
int px=x+Elephant[i][0];
int py=y+Elephant[i][1];
if(h[px][py])continue;
if(tx==dx&&ty==dy){
printst(x,y);
if(h[tx][ty]==2-color%2)printst(tx,ty);
else cout<<"NA;";
a[tx][ty]=a[x][y],h[tx][ty]=h[x][y];
a[x][y]=h[x][y]=0;
jiangjun();
if(checkcaptain())cout<<"no"<<"\n";
else cout<<"yes"<<"\n",End=1;
color++;
return;
}
}
cout<<"Invalid command"<<"\n";
}
void check4(int x,int y,int dx,int dy){
for(int i=0;i<8;i++){
int tx=x+horse[i][0];
int ty=y+horse[i][1];
int px=x+Horse[i][0];
int py=y+Horse[i][1];
if(h[px][py])continue;
if(tx==dx&&ty==dy){
printst(x,y);
if(h[tx][ty]==2-color%2)printst(tx,ty);
else cout<<"NA;";
a[tx][ty]=a[x][y],h[tx][ty]=h[x][y];
a[x][y]=h[x][y]=0;
jiangjun();
if(checkcaptain())cout<<"no"<<"\n";
else cout<<"yes"<<"\n",End=1;
color++;
return;
}
}
cout<<"Invalid command"<<"\n";
}
void check5(int x,int y,int dx,int dy){
for(int i=x+1;i<=10;i++){//車的拓展
int tx=i,ty=y;
if(tx==dx&&ty==dy){
printst(x,y);
if(h[tx][ty]==2-color%2)printst(tx,ty);
else cout<<"NA;";
a[tx][ty]=a[x][y],h[tx][ty]=h[x][y];
a[x][y]=h[x][y]=0;
jiangjun();
if(checkcaptain())cout<<"no"<<"\n";
else cout<<"yes"<<"\n",End=1;
color++;
return;
}
if(h[tx][ty])break;
}
for(int i=x-1;i>=1;i--){
int tx=i,ty=y;
if(tx==dx&&ty==dy){
printst(x,y);
if(h[tx][ty]==2-color%2)printst(tx,ty);
else cout<<"NA;";
a[tx][ty]=a[x][y],h[tx][ty]=h[x][y];
a[x][y]=h[x][y]=0;
jiangjun();
if(checkcaptain())cout<<"no"<<"\n";
else cout<<"yes"<<"\n",End=1;
color++;
return;
}
if(h[tx][ty])break;
}
for(int i=y+1;y<=9;i++){
int tx=x,ty=i;
if(tx==dx&&ty==dy){
printst(x,y);
if(h[tx][ty]==2-color%2)printst(tx,ty);
else cout<<"NA;";
a[tx][ty]=a[x][y],h[tx][ty]=h[x][y];
a[x][y]=h[x][y]=0;
jiangjun();
if(checkcaptain())cout<<"no"<<"\n";
else cout<<"yes"<<"\n",End=1;
color++;
return;
}
if(h[tx][ty])break;
}
for(int i=y-1;y>=1;i--){
int tx=x,ty=i;
if(tx==dx&&ty==dy){
printst(x,y);
if(h[tx][ty]==2-color%2)printst(tx,ty);
else cout<<"NA;";
a[tx][ty]=a[x][y],h[tx][ty]=h[x][y];
a[x][y]=h[x][y]=0;
jiangjun();
if(checkcaptain())cout<<"no"<<"\n";
else cout<<"yes"<<"\n",End=1;
color++;
return;
}
if(h[tx][ty])break;
}
cout<<"Invalid command"<<"\n";
}
void check6(int x,int y,int dx,int dy){
for(int i=0;i<8;i++){
int tx=x+duck[i][0];
int ty=y+duck[i][1];
int px1=x+Duck[i][0],px2=x+Duck[i+8][0];
int py1=y+Duck[i][1],py2=y+Duck[i+8][1];
if(h[px1][py1]||h[px2][py2])continue;
if(tx==dx&&ty==dy){
printst(x,y);
if(h[tx][ty]==2-color%2)printst(tx,ty);
else cout<<"NA;";
a[tx][ty]=a[x][y],h[tx][ty]=h[x][y];
a[x][y]=h[x][y]=0;
jiangjun();
if(checkcaptain())cout<<"no"<<"\n";
else cout<<"yes"<<"\n",End=1;
color++;
return;
}
}
cout<<"Invalid command"<<"\n";
}
void check7(int x,int y,int dx,int dy){
for(int i=0;i<8;i++){
int tx=x+soldier[i][0];
int ty=y+soldier[i][1];
if(tx==dx&&ty==dy){
printst(x,y);
if(h[tx][ty]==2-color%2)printst(tx,ty);
else cout<<"NA;";
a[tx][ty]=a[x][y],h[tx][ty]=h[x][y];
a[x][y]=h[x][y]=0;
jiangjun();
if(checkcaptain())cout<<"no"<<"\n";
else cout<<"yes"<<"\n",End=1;
color++;
return;
}
}
cout<<"Invalid command"<<"\n";
}
int main(){
Clean();
int T=read();
while(T--){
int xs=read()+1,ys=read()+1,xt=read()+1,yt=read()+1;
if((!bianjie(xs,ys))||(!bianjie(xt,yt))||End){//判斷程序結束或是起點和落子點出界
cout<<"Invalid command"<<"\n";
continue;
}
if(color%2==0){//判斷當前哪一方走棋
if(h[xs][ys]!=1||h[xt][yt]==1){
cout<<"Invalid command"<<"\n";
continue;
}
}else{
if(h[xs][ys]!=2||h[xt][yt]==2){
cout<<"Invalid command"<<"\n";
continue;
}
}
if(a[xs][ys]==1)check1(xs,ys,xt,yt);
else if(a[xs][ys]==2)check2(xs,ys,xt,yt);
else if(a[xs][ys]==3)check3(xs,ys,xt,yt);
else if(a[xs][ys]==4)check4(xs,ys,xt,yt);
else if(a[xs][ys]==5)check5(xs,ys,xt,yt);
else if(a[xs][ys]==6)check6(xs,ys,xt,yt);
else if(a[xs][ys]==7)check7(xs,ys,xt,yt);//分類討論每一個點
}
return 0;
}