消消乐

题目描述

某消除类的游戏,玩家每次操作可以将相邻的图形进行交换,如果交换后出现三个以上的连续图形时,这些图形就会消失
图形消失后,同一列上面的图形会往下掉。最上方的位置为空
现给定一个初始稳定的局面和一次交换操作,请计算此次操作能消除多少图形

示例

输出
4 4
HFCE
GCAC
GFAD
DCBA
3 2 3 3
输出
3
输入
4 4
0F0E
0CAC
GFAD
AABA
3 2 3 3
输出
5

代码

import java.util.LinkedList;
import java.util.Queue;
import java.util.Scanner;
public class Main {
    private static Queue<Integer> queue = new LinkedList<>();
    private static void move(char[][] map, int x, int y, int len) {
        for(int i = x; i >= len; --i) {
            map[i][y] = map[i - len][y];
            queue.add(i*100+y);
        }
        for(int i = len-1; i >= 0; --i)
            map[i][y] = '0';
    }
    private static void move2(char[][] map, int x, int y, int len, int flag, int tx, int ty) {
        for(int i = 0; i < len; ++i) {
            if(x == tx && y+i == ty && flag > 2);
            else move(map, x, y + i, 1);
        }
    }
    private static void modify(char[][] map, int x, int y) {
        if(map[x][y] == '0') return;
        // 上下
        int tx1 = x, ty = y, len1 = 1;
        for(int i = x-1; i >= 0; --i) {
            if(map[i][y] == map[x][y])
                ++len1;
            else break;
        }
        for(int i = x+1; i < map.length; ++i) {
            if(map[i][y] == map[x][y]) {
                ++len1;
                tx1 = Math.max(tx1, i);
            } else break;
        }

        // 左右
        int tx2 = x, ty2 = y, len2 = 1;
        for(int i = y-1; i >= 0; --i) {
            if(map[x][i] == map[x][y]) {
                ++len2;
                ty2 = Math.min(ty2, i);
            } else break;
        }
        for(int i = y+1; i < map[0].length; ++i) {
            if (map[x][i] == map[x][y]) {
                ++len2;
            } else break;
        }
        if(len1 > 2) move(map, tx1, ty, len1);
        if(len2 > 2) move2(map, tx2, ty2, len2, len1, x, y);
    }
    public static void main(String[] args) {
        Scanner sca = new Scanner(System.in);
        int r = sca.nextInt(), c = sca.nextInt();
        char[][] map = new char[r][c];
        int cnt = 0;
        for(int i = 0; i < r; ++i) {
            String str = sca.next();
            for(int j = 0; j < str.length(); ++j) {
                map[i][j] = str.charAt(j);
                if (map[i][j] == '0')
                    ++cnt;
            }
        }
        int r1 = sca.nextInt(), c1 = sca.nextInt(), r2 = sca.nextInt(), c2 = sca.nextInt();
        char tmp = map[r1][c1];
        map[r1][c1] = map[r2][c2];
        map[r2][c2] = tmp;
        queue.offer(r1*100+c1);
        queue.offer(r2*100+c2);
        while(!queue.isEmpty()) {
            int x = queue.peek()/100, y = queue.poll()%100;
            modify(map, x, y);
        }
        int newCnt = 0;
        for(char[] rr : map)
            for(char cc : rr) {
                if(cc == '0')
                    ++newCnt;
            }
        System.out.println(newCnt-cnt);
    }
}
02-11 04:09