2018年全国多校算法寒假训练营练习比赛(第一场)C-六子冲(大模拟)
2018-01-22 17:55
441 查看
https://www.nowcoder.com/acm/contest/67/C
题目链接如上。
思路:纯粹的模拟,不过要注意只有两个打一个子才能吃掉,就是只有图片上的那八种情况。我的做法是上面的为part1,下面的为part2,然后对每一步寻找移动过后是否会发生打击,对于改行列找到part1和part2的棋子个数,只有两者为2和1的时候才会发生打击,然后再看这两个棋子是否是相连的,只有相连的才有可能发生打击,然后再找到第一个与其不想连的,如果是空的话,就是没有发生打击,如果是另一个part,就是发生了打击。
代码如下:
题目链接如上。
思路:纯粹的模拟,不过要注意只有两个打一个子才能吃掉,就是只有图片上的那八种情况。我的做法是上面的为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; }
相关文章推荐
- 2018年全国多校算法寒假训练营练习比赛(第一场)C. 六子冲(模拟)
- 2018年全国多校算法寒假训练营练习比赛(第一场) - B - 最强的决斗者一切都是必然的!(模拟)
- 2018年全国多校算法寒假训练营练习比赛(第一场) - G - 圆圈(找规律,模拟)
- 2018年全国多校算法寒假训练营练习比赛(第一场)F. 大吉大利,今晚吃鸡——跑毒篇(模拟)
- 2018年全国多校算法寒假训练营练习比赛(第一场)C - 六子冲
- 2018年全国多校算法寒假训练营练习比赛(第一场) - D - N阶汉诺塔变形(模拟)
- 2018年全国多校算法寒假训练营练习比赛(第一场) - F - 大吉大利,今晚吃鸡——跑毒篇
- 2018年全国多校算法寒假训练营练习比赛(第一场)-I找数字个数
- 2018年全国多校算法寒假训练营练习比赛(第二场) A 吐泡泡(模拟)
- 2018年全国多校算法寒假训练营练习比赛(第二场) A 吐泡泡(模拟)
- 2018年全国多校算法寒假训练营练习比赛(第一场)题解
- 2018年全国多校算法寒假训练营练习比赛(第二场) A 吐泡泡(模拟)
- 2018年全国多校算法寒假训练营练习比赛(第一场)-A大吉大利,今晚吃鸡——枪械篇
- 2018年全国多校算法寒假训练营练习比赛(第二场) A 吐泡泡(模拟)
- 2018年全国多校算法寒假训练营练习比赛(第一场)I
- 2018年全国多校算法寒假训练营练习比赛(第二场)A 吐泡泡 【模拟】
- 2018年全国多校算法寒假训练营练习比赛(第一场)
- 2018年全国多校算法寒假训练营练习比赛(第一场) -H方块与收纳盒
- 牛客网 2018年全国多校算法寒假训练营练习比赛(第一场) 题解
- 2018年全国多校算法寒假训练营练习比赛(第一场)G-圆圈