UVA 1589 Xiangqi 直接模拟 提交了近50次要跪。。

               好吧,本题采用的方法是直接模拟,把红方可以攻击到的位置全部都记录下来,然后判定黑方是不是在4个方向上都可能走到

               PS:在判定炮的路线的时候少写了一个判断条件,直接导致陷入无限WA。。。最后和网上的源码一段段来比较才发现是这样的一个问题。。。看来写代码的时候还是不够仔细。。。

               还有一点,用scanf(“%d%d%d%*c")和scanf("%c%d%d%*c")莫名WA,怀疑是数据某个地方多了空格导致,这道题目还是折腾了我一晚上+一个上午的。。。


#include<cstdio>
#include<cstring>
#include<vector>
#include<iostream>

using namespace std;

int n,bx,by,x,y,attack[15][15];
char c,board[15][15];

vector<pair<int,int>> v;
void setattack(int i);
bool checkmate();

int main(){
    ios_base::sync_with_stdio(false);
    while(cin>>n>>bx>>by&&n){
        for(int i=0;i<n;++i){
            cin>>c>>x>>y,board[x][y]=c,v.push_back(make_pair(x,y));
        }
        for(int i=0;i<v.size();++i)
            setattack(i);
        printf("%s\n",(checkmate()?"YES":"NO"));
        memset(board,0,sizeof(board));
        memset(attack,0,sizeof(attack));
        v.clear();
    }
    return 0;
}

bool checkmate(){
    if(bx==1){
        if(by==4)
            return attack[2][4]&&attack[1][5];
        else if(by==5)
            return attack[1][4]&&attack[2][5]&&attack[1][6];
        else
            return attack[1][5]&&attack[2][6];
    }
    else if(bx==2){
        if(4==by)
            return attack[1][4]&&attack[2][5]&&attack[3][4];
        else if(5==by)
            return attack[2][4]&&attack[1][5]&&attack[3][5]&&attack[2][6];
        else
            return attack[1][6]&&attack[2][5]&&attack[3][6];
    }
    else{
        if(4==by)
            return attack[2][4]&&attack[3][5];
        else if(5==by)
            return attack[3][4]&&attack[3][6]&&attack[2][5];
        else
            return attack[2][6]&&attack[3][5];
    }
}


void setattack(int i){
    switch(board[v[i].first][v[i].second]){
case 'G':{
    int ch=-1;
    while(v[i].first+ch>1&&!board[v[i].first+ch][v[i].second])attack[v[i].first+ch][v[i].second]=1,--ch;
    attack[v[i].first+ch][v[i].second]=1;
    break;
}
case 'H':{
    if(v[i].first>2&&!board[v[i].first-1][v[i].second]){
        if(v[i].second>1)
            attack[v[i].first-2][v[i].second-1]=1;
        if(v[i].second<9)
            attack[v[i].first-2][v[i].second+1]=1;
    }
    if(v[i].first<9&&!board[v[i].first+1][v[i].second]){
        if(v[i].second>1)
            attack[v[i].first+2][v[i].second-1]=1;
        if(v[i].second<9)
            attack[v[i].first+2][v[i].second+1]=1;
    }
    if(v[i].second>2&&!board[v[i].first][v[i].second-1]){
        if(v[i].first>1)
            attack[v[i].first-1][v[i].second-2]=1;
        if(v[i].first<10)
            attack[v[i].first+1][v[i].second-2]=1;
    }
    if(v[i].second<8&&!board[v[i].first][v[i].second+1]){
        if(v[i].first>1)
            attack[v[i].first-1][v[i].second+2]=1;
        if(v[i].first<10)
            attack[v[i].first+1][v[i].second+2]=1;
    }
    break;
}
case 'C':{
    int ch=1;
    while(v[i].first+ch<10&&!board[v[i].first+ch][v[i].second])++ch;
    if(board[v[i].first+ch][v[i].second]){
        ++ch;
        while(v[i].first+ch<10&&!board[v[i].first+ch][v[i].second])attack[v[i].first+ch][v[i].second]=1,++ch;
        attack[v[i].first+ch][v[i].second]=1;
    }
    ch=-1;
    while(v[i].first+ch>1&&!board[v[i].first+ch][v[i].second])--ch;
    if(board[v[i].first+ch][v[i].second]){
        --ch;
        while(v[i].first+ch>1&&!board[v[i].first+ch][v[i].second])attack[v[i].first+ch][v[i].second]=1,--ch;
        attack[v[i].first+ch][v[i].second]=1;
    }
    ch=1;
    while(v[i].second+ch<9&&!board[v[i].first][v[i].second+ch])++ch;
    if(board[v[i].first][v[i].second+ch]){
        ++ch;
        while(v[i].second+ch<9&&!board[v[i].first][v[i].second+ch])attack[v[i].first][v[i].second+ch]=1,++ch;
        attack[v[i].first][v[i].second+ch]=1;
    }
    ch=-1;
    while(v[i].second+ch>1&&!board[v[i].first][v[i].second+ch])--ch;
    if(board[v[i].first][v[i].second+ch]){
        --ch;
        while(v[i].second+ch>1&&!board[v[i].first][v[i].second+ch])attack[v[i].first][v[i].second+ch]=1,--ch;
        attack[v[i].first][v[i].second+ch]=1;
    }
    break;
}
case 'R':{
    int ch=1;
    while(v[i].first+ch<10&&!board[v[i].first+ch][v[i].second])attack[v[i].first+ch][v[i].second]=1,++ch;
    attack[v[i].first+ch][v[i].second]=1;
    ch=-1;
    while(v[i].first+ch>1&&!board[v[i].first+ch][v[i].second])attack[v[i].first+ch][v[i].second]=1,--ch;
    attack[v[i].first+ch][v[i].second]=1;
    ch=1;
    while(v[i].second+ch<9&&!board[v[i].first][v[i].second+ch])attack[v[i].first][v[i].second+ch]=1,++ch;
    attack[v[i].first][v[i].second+ch]=1;
    ch=-1;
    while(v[i].second+ch>1&&!board[v[i].first][v[i].second+ch])attack[v[i].first][v[i].second+ch]=1,--ch;
    attack[v[i].first][v[i].second+ch]=1;
    break;
}
    }
}





  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值