2018年全国多校算法寒假训练营练习比赛(第一场)C-六子冲(大模拟)

时间:2023-01-26 00:19:18

https://www.nowcoder.com/acm/contest/67/C

题目链接如上。

思路:纯粹的模拟,不过要注意只有两个打一个子才能吃掉,就是只有图片上的那八种情况。我的做法是上面的为part1,下面的为part2,然后对每一步寻找移动过后是否会发生打击,对于改行列找到part1和part2的棋子个数,只有两者为2和1的时候才会发生打击,然后再看这两个棋子是否是相连的,只有相连的才有可能发生打击,然后再找到第一个与其不想连的,如果是空的话,就是没有发生打击,如果是另一个part,就是发生了打击。

代码如下:

#include<iostream>
#include<algorithm>
#include<iomanip>
using namespace std;
const int MAX = 10;
int Map[MAX][MAX];

void init(){//对棋盘进行初始化
    for(int i=1;i<=4;++i)
        for(int j=1;j<=4;++j)
            Map[i][j] = 0;
    Map[1][1] = 11;Map[1][2] = 10;Map[1][3] = 9;Map[1][4] = 8;
    Map[2][1] = 12;Map[2][4] = 7;Map[3][1] = 1;Map[3][4] = 6;
    Map[4][1] = 2;Map[4][2] = 3;Map[4][3] = 4;Map[4][4] = 5;
}
void Display(){//用于显示棋盘
    for(int i=1;i<=4;++i){
        for(int j=1;j<=4;++j){
            cout << setw(3) << Map[i][j];
        }
        cout << endl;
    }
}
int Get(int value){//得到这个value是属于哪一个part的
    if(value == 0)
        return 0;
    if(7 <= value && value <= 12)
        return 1;
    else
        return 2;
}
void hurt(int part,int x,int y){
    int tx = 0,ty = y;
    int Belong = 0,UnBelong = 0;//属于该part和不属于该part的。
    //相对这一列进行寻找
    while(++tx <= 4){
        if(Get(Map[tx][ty]) == part)
            Belong++;
        else if(Get(Map[tx][ty] == 0))
            continue;
        else
            UnBelong++;
    }
    //只有2,1才会发生打击
    if(Belong == 2 && UnBelong == 1){
        int Count = 1;//判断这2个是否相连
        tx = x-1;
        if(tx >= 1 && Get(Map[tx][ty]) == part)
            Count++;
        tx = x+1;
        if(tx <= 4 && Get(Map[tx][ty]) == part)
            Count++;
        if(Count == 2){
            //寻找到第一个不相连的,如果是另一个part的,就直接打击掉
            tx = x;
            while(--tx >= 1){
                if(Get(Map[tx][ty]) == 0)
                    break;
                else if(Get(Map[tx][ty]) != part){//发生打击
                    Map[tx][ty] = 0;
                    break;
                }
                else
                    continue;
            }
            tx = x;
            while(++tx <= 4){
                if(Get(Map[tx][ty]) == 0)
                    break;
                else if(Get(Map[tx][ty]) != part){
                    Map[tx][ty] = 0;
                    break;
                }
                else
                    continue;
            }
        }
    }
    //下面是对行进行寻找。因为会有同时打击两个的情况。
    tx = x;ty = 0;
    Belong = 0,UnBelong = 0;
    while(++ty <= 4){
        if(Get(Map[tx][ty]) == part)
            Belong++;
        else if(Get(Map[tx][ty] == 0))
            continue;
        else
            UnBelong++;
    }
    if(Belong == 2 && UnBelong == 1){
        int Count = 1;
        ty = y - 1;
        if(ty >= 1 && Get(Map[tx][ty]) == part)
            Count++;
        ty = y+1;
        if(ty <= 4 && Get(Map[tx][ty]) == part)
            Count++;
        if(Count == 2){
            ty = y;
            while(--ty >= 1){
                if(Get(Map[tx][ty]) == 0)
                    break;
                else if(Get(Map[tx][ty]) != part){
                    Map[tx][ty] = 0;
                    break;
                }
                else
                    continue;
            }
            ty = y;
            while(++ty <= 4){
                if(Get(Map[tx][ty]) == 0)
                    break;
                else if(Get(Map[tx][ty]) != part){
                    Map[tx][ty] = 0;
                    break;
                }
                else
                    continue;
            }
        }
    }
}

void move(int x,int p){//移动该棋子
    //先寻找到该value的坐标
    int px = 0,py = 0;
    for(int i=1;i<=4;++i){
        bool isok = false;
        for(int j=1;j<=4;++j){
            if(Map[i][j] == x){
                px = i;py = j;
                isok = true;
                break;
            }
        }
        if(isok)    break;
    }
    //按其方向进行移动,移动到tx,ty。
    int tx = px,ty =py;
    if(p == 1)
        tx -= 1;
    else if(p == 2)
        tx += 1;
    else if(p == 3)
        ty -= 1;
    else
        ty += 1;
    Map[tx][ty] = Map[px][py];
    Map[px][py] = 0;
    int part = (7 <= x && x <= 12)? 1:2;
    hurt(part,tx,ty);//进行打击判断。

}
int main(void){
    int N,q,p;
    int Case = 0;
    while(cin >> N){
        init();
        for(int i=1;i<=N;++i){
            cin >> q >> p;
            move(q,p);
        }
        cout << "#Case " << ++Case << ":" << endl;
        Display();
    }
    return 0;
}