View on GitHub

coderbreakplus.github.io

Prev

#include<bits/stdc++.h>
using namespace std;
#define captain 0
#define guard 1
#define elephant 2
#define horse 3
#define car 4
#define duck 5
#define soldier 6 // 棋子的编号
#define red 0
#define blue 1 // 执棋方的编号
typedef pair<int,int> P; // 执棋方;棋子
P chess[10][9]; // 棋盘
#define mkp(a,b) make_pair(a,b)
int redcapx,redcapy,bluecapx,bluecapy; // 王的位置
inline void init(){
    redcapx=0,redcapy=4,bluecapx=9,bluecapy=4;
    chess[0][0]=mkp(red,car),chess[0][1]=mkp(red,horse),chess[0][2]=mkp(red,elephant);
    chess[0][3]=mkp(red,guard),chess[0][4]=mkp(red,captain),chess[0][5]=mkp(red,guard);
    chess[0][6]=mkp(red,elephant),chess[0][7]=mkp(red,horse),chess[0][8]=mkp(red,car);
    for(int i=0;i<=8;i++) chess[1][i]=mkp(-1,-1);
    chess[2][0]=chess[2][8]=mkp(red,duck);
    for(int i=1;i<8;i++) chess[2][i]=mkp(-1,-1);
    for(int i=0;i<=8;i++){
        if(i%2==0) chess[3][i]=mkp(red,soldier);
        else chess[3][i]=mkp(-1,-1);
    }
    for(int i=4;i<=5;i++)
        for(int j=0;j<=8;j++) chess[i][j]=mkp(-1,-1);
    for(int i=0;i<=8;i++){
        if(i%2==0) chess[6][i]=mkp(blue,soldier);
        else chess[6][i]=mkp(-1,-1);
    }
    chess[7][0]=chess[7][8]=mkp(blue,duck);
    for(int i=1;i<8;i++) chess[7][i]=mkp(-1,-1);
    for(int i=0;i<=8;i++) chess[8][i]=mkp(-1,-1);
    chess[9][0]=mkp(blue,car),chess[9][1]=mkp(blue,horse),chess[9][2]=mkp(blue,elephant);
    chess[9][3]=mkp(blue,guard),chess[9][4]=mkp(blue,captain),chess[9][5]=mkp(blue,guard);
    chess[9][6]=mkp(blue,elephant),chess[9][7]=mkp(blue,horse),chess[9][8]=mkp(blue,car);
} // 初始棋盘
const int dx[8]={1,0,0,-1,1,1,-1,-1};
const int dy[8]={0,1,-1,0,1,-1,1,-1}; // 兵的走法
const int carx[4]={1,0,0,-1},cary[4]={0,1,-1,0}; // 车/王的走法
const int gx[4]={1,1,-1,-1},gy[4]={1,-1,1,-1}; // 士的走法
bool inchess(int s1,int t1){
    return (s1>=0)&&(s1<=9)&&(t1>=0)&&(t1<=8);
}
bool moved(int man,int s1,int t1,int s2,int t2){ // 判断是不是能走
    if(man==soldier){ // 兵
        for(int i=0;i<8;i++){
            int tmpx=s1+dx[i],tmpy=t1+dy[i];
            if(tmpx==s2 && tmpy==t2) return true;
        }
    }else if(man==car){ // 车
        for(int i=0;i<4;i++){
            int tmpx=s1,tmpy=t1;
            while(1){
                tmpx+=carx[i],tmpy+=cary[i];
                if(!inchess(tmpx,tmpy)) break;
                if(tmpx==s2 && tmpy==t2) return true;
                if(chess[tmpx][tmpy].first!=-1) break;
            }
        }
    }else if(man==horse){ // 马 (hard)
        for(int i=-1;i<=1;i++)
            for(int j=-1;j<=1;j++){
                if(i==0 || j==0) continue;
                if(inchess(s1+2*i,t1+j) && chess[s1+i][t1].first==-1){
                    if(s1+2*i==s2 && t1+j==t2) return true;
                }
                if(inchess(s1+i,t1+2*j) && chess[s1][t1+j].first==-1){
                    if(s1+i==s2 && t1+2*j==t2) return true;
                }
            }
    }else if(man==elephant){ // 象 (hard)
        for(int i=-1;i<=1;i++)
            for(int j=-1;j<=1;j++){
                if(i==0 || j==0) continue;
                if(inchess(s1+2*i,t1+2*j) && chess[s1+i][t1+j].first==-1){
                    if(s1+2*i==s2 && t1+2*j==t2) return true;
                }
            }
    }else if(man==duck){ // 鸭 (hard+)
        for(int i=-1;i<=1;i++)
            for(int j=-1;j<=1;j++){
                if(i==0 || j==0) continue;
                if(inchess(s1+3*i,t1+2*j) && chess[s1+i][t1].first==-1 && chess[s1+2*i][t1+j].first==-1){
                    if(s1+3*i==s2 && t1+2*j==t2) return true;
                }
                if(inchess(s1+2*i,t1+3*j) && chess[s1][t1+j].first==-1 && chess[s1+i][t1+2*j].first==-1){
                    if(s1+2*i==s2 && t1+3*j==t2) return true;
                }
            }
    }else if(man==captain){ // 王 
        for(int i=0;i<4;i++){
            int tmpx=s1+carx[i],tmpy=t1+cary[i];
            if(tmpx==s2 && tmpy==t2) return true;
        }
    }else{ // 士
        for(int i=0;i<4;i++){
            int tmpx=s1+gx[i],tmpy=t1+gy[i];
            if(tmpx==s2 && tmpy==t2) return true;
        }
    }
    return false;
}
int ready_kill(){ // 判断将军
    for(int i=0;i<=9;i++)
        for(int j=0;j<=8;j++){
            if(chess[i][j].first==red)
            if(moved(chess[i][j].second,i,j,bluecapx,bluecapy)) return 1;
        }
    for(int i=0;i<=9;i++)
        for(int j=0;j<=8;j++){
            if(chess[i][j].first==blue)
            if(moved(chess[i][j].second,i,j,redcapx,redcapy)) return 1;
        }
    return 0;
}
struct Return{
    P mover,tomove;
    bool ready_kill,killed;
    Return(){
        mover=tomove=mkp(-1,-1);
        ready_kill=killed=false;
    }
};
bool end1; // 结束
Return moveit(int player,int s1,int t1,int s2,int t2){ // 移动,不合法返回 -1
    Return ans;
    if(chess[s1][t1].first!=player) return ans;
    if(chess[s2][t2].first==player) return ans;
    if(!moved(chess[s1][t1].second,s1,t1,s2,t2)) return ans;
    ans.mover=chess[s1][t1];
    if(chess[s2][t2].first^1==player){ // 吃了这个子
        ans.tomove=chess[s2][t2];
        if(chess[s2][t2].second==captain){
            ans.killed=true;
            return ans;
        }
    }
    chess[s2][t2]=chess[s1][t1],chess[s1][t1]=mkp(-1,-1);
    if(chess[s2][t2].second==captain){
        if(player==red) redcapx=s2,redcapy=t2;
        else bluecapx=s2,bluecapy=t2;
    }
    if(ready_kill()) ans.ready_kill=true; // 将军
    return ans;
}
int q,s1,t1,s2,t2;
string str[9]={"captain","guard","elephant","horse","car","duck","soldier"};
inline void print(P a){
    if(a.first==red) cout<<"red ";
    else cout<<"blue ";
    cout<<str[a.second]<<";";
}
int main(){
    init();
    cin>>q;
    int player=red;
    for(int i=1;i<=q;i++){
        cin>>s1>>t1>>s2>>t2;
        Return tmp=moveit(player,s1,t1,s2,t2);
        if(tmp.mover==mkp(-1,-1) || end1){
            cout<<"Invalid command\n";
            continue;
        }
        print(tmp.mover);
        if(tmp.tomove==mkp(-1,-1)) cout<<"NA;";
        else print(tmp.tomove);
        if(tmp.ready_kill) cout<<"yes;"; else cout<<"no;";
        if(tmp.killed){
            cout<<"yes"; end1=true;
        }else cout<<"no";
        cout<<endl; player^=1;
    }
    return 0;
}