专栏首页mathor2018年全国多校算法寒假训练营练习比赛(第一场)六子冲

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

题目链接:六子冲

 棋盘上攻击方的2个棋子(2子必须相连并主动移动其中的1个)与被攻方的1个棋子皆处在一条直线上并相邻时,被攻方的这个棋子就被消灭  每次移动后判断一下,移动后棋子的那一行和一列,判断是否可以消灭其他子  若一行中有4子或3子不连通或攻击方的子数只有一个或3个 则无法消灭任何棋子

import java.util.Scanner;
public class Main {
    static int n;
    static int p;
    static int q;
    static int cas = 0;
    static int x[] = new int[15];
    static int y[] = new int[15];
    static int map[][] = new int[10][10];
    static int dr[][] = {{0,0},{-1,0},{1,0},{0,-1},{0,1}};
    public static void init() {
        for(int i = 0;i < 10;i++)
            for(int j = 0;j < 10;j++)
                map[i][j] = 0;
        x[11] = x[10] = x[9] = x[8] = 1;
        x[2] = x[3] = x[4] = x[5] = 4;
        x[1] = x[6] = 3;
        x[12] = x[7] = 2;
        y[11] = y[12] = y[1] = y[2] = 1;
        y[10] = y[3] = 2;
        y[9] = y[4] = 3;
        y[8] = y[7] = y[6] = y[5] = 4;
        for(int i = 1;i <= 12;i++)
            map[x[i]][y[i]] = i;
    }
    public static void update() {
        map[x[p]][y[p]] = 0;
        x[p] += dr[q][0];
        y[p] += dr[q][1];
        map[x[p]][y[p]] = p;
        check(1);
        check(2);
    }
    public static void check(int t) {
        int bk,wt,num,last;
        bk = wt = num = last = 0;
        for(int i = 1;i <= 4;i++) {
            if(t == 1)
                num = map[x[p]][i];
            else 
                num = map[i][y[p]];
            if(num == 0 && (i == 2 || i == 3))
                return;
            if(num > 6) {
                if(last == 1 && wt == 1)
                    return;
                wt++;
                last = 2;
            } else if(num > 0) {
                if(last == 2 && bk == 1)
                    return;
                bk++;
                last = 1;
            }
        }
        if((bk == 2 && wt == 1 && p <= 6) || (bk == 1 && wt == 2 && p > 6)) {
            for(int i = 1;i <= 4;i++) {
                if(t == 1)
                    num = map[x[p]][i];
                else
                    num = map[i][y[p]];
                if((wt == 1 && num > 6) || (bk == 1 && num <= 6))
                        map[x[num]][y[num]] = 0;
            }
        }
    }
    public static void main(String[] args) {
        Scanner cin = new Scanner(System.in);
        while(cin.hasNext()) {
            n = cin.nextInt();
            init();
            for(int i = 0;i < n;i++) {
                p = cin.nextInt();
                q = cin.nextInt();
                update();
            }
            System.out.println("#Case " + ++cas + ":");
            for(int i = 1;i <= 4;i++) {
                for(int j = 1;j <= 4;j++) 
                    System.out.printf("%3d",map[i][j]);
                System.out.println();
            }
        }
    }
}

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 2017百度之星资格赛:1004. 度度熊的午饭时光

    mathor
  • CodeForces D.Powerful array(Div.1)

     大意是是说,问区间[L,R]内的的一个值,这个值是arr[x]出现次数cnt[arr[x]]^2^*arr[x]  这道题Java版的莫队怎么都tle,...

    mathor
  • LeetCode215.数组中的第K个最大元素

    mathor
  • 【2020HBU天梯赛训练】7-40 列车调度

    两端分别是一条入口(Entrance)轨道和一条出口(Exit)轨道,它们之间有N条平行的轨道。每趟列车从入口可以选择任意一条轨道进入,最后从出口离开。在图中有...

    韩旭051
  • HDU 5806

    思路:尺取法!!如果已经统计过的数中有k个数是不小于m的,那么后面再加上任意数,这个区间都符合要求。想通了这一点,这道题便好做了。 一发AC

    用户7727433
  • 【POJ 3320】Jessica's Reading Problemc(尺取法)

      尺取时,l和r 代表区间两边,每次r++时,d[r]即r的出现次数+1,d[l]即l的出现次数大于1时,左边可以短一点,d[l]--,l++,直到d[l]出...

    饶文津
  • P1401 城市(30分,正解网络流)

    题目描述 N( )个城市,M( )条无向边,你要找T( )条从城市1到城市N的路,使得最长的边的长度最小,边不能重复用。 输入输出格式 输入格式: 第1行...

    attack
  • C/C++ Const 小知识

    [描述] 在 C、C++、D 和 JavaScript 编程语言中,const是一个类型限定符一个应用于数据类型的关键字,表示数据是只读的。Const - Wi...

    半纸渊
  • 1231 最优布线问题

    1231 最优布线问题 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 白银 Silver 题目描述 Description 学...

    attack
  • 使用VS2010 C#开发ActiveX控件

      在网上查了一些资料也实际操作了一下,在此自己再作一次详细记录。   功能:将对机具操作的FK.dll封装成fk.ocx,注册后能在网页上对机器操作。 使用V...

    欢醉

扫码关注云+社区

领取腾讯云代金券