package cn.iocoder.yudao.framework.common.thealgorithms.backtracking;

///**
// * Java program for Flood fill algorithm.
// * @author Akshay Dubey (<a href="https://github.com/itsAkshayDubey">Git-Akshay Dubey</a>)
// */
//public final class FloodFill {
//    private FloodFill() {
//    }
//
//    /**
//     * Get the color at the given coordinates of a 2D image
//     *
//     * @param image The image to be filled
//     * @param x The x co-ordinate of which color is to be obtained
//     * @param y The y co-ordinate of which color is to be obtained
//     */
//
//    public static int getPixel(final int[][] image, final int x, final int y) {
//        return image[x][y];
//    }
//
//    /**
//     * Put the color at the given coordinates of a 2D image
//     *
//     * @param image The image to be filled
//     * @param x The x co-ordinate at which color is to be filled
//     * @param y The y co-ordinate at which color is to be filled
//     */
//    public static void putPixel(final int[][] image, final int x, final int y, final int newColor) {
//        image[x][y] = newColor;
//    }
//
//    /**
//     * Fill the 2D image with new color
//     *
//     * @param image The image to be filled
//     * @param x The x co-ordinate at which color is to be filled
//     * @param y The y co-ordinate at which color is to be filled
//     * @param newColor The new color which to be filled in the image
//     * @param oldColor The old color which is to be replaced in the image
//     */
//    public static void floodFill(final int[][] image, final int x, final int y, final int newColor, final int oldColor) {
//        if (newColor == oldColor || x < 0 || x >= image.length || y < 0 || y >= image[x].length || getPixel(image, x, y) != oldColor) {
//            return;
//        }
//
//        putPixel(image, x, y, newColor);
//
//        /* Recursively check for horizontally & vertically adjacent coordinates */
//        floodFill(image, x + 1, y, newColor, oldColor);
//        floodFill(image, x - 1, y, newColor, oldColor);
//        floodFill(image, x, y + 1, newColor, oldColor);
//        floodFill(image, x, y - 1, newColor, oldColor);
//
//        /* Recursively check for diagonally adjacent coordinates  */
//        floodFill(image, x + 1, y - 1, newColor, oldColor);
//        floodFill(image, x - 1, y + 1, newColor, oldColor);
//        floodFill(image, x + 1, y + 1, newColor, oldColor);
//        floodFill(image, x - 1, y - 1, newColor, oldColor);
//    }
//}

/**
 * Java程序实现泛洪填充算法。
 * @author Akshay Dubey (<a href="https://github.com/itsAkshayDubey">Git-Akshay Dubey</a>)
 */
public final class FloodFill {
    private FloodFill() {
    }

    /**
     * 获取2D图像给定坐标的颜色
     *
     * @param image 要填充的图像
     * @param x 要获取颜色的x坐标
     * @param y 要获取颜色的y坐标
     */
    public static int getPixel(final int[][] image, final int x, final int y) {
        return image[x][y];
    }

    /**
     * 在2D图像的给定坐标处填充颜色
     *
     * @param image 要填充的图像
     * @param x 要填充颜色的x坐标
     * @param y 要填充颜色的y坐标
     */
    public static void putPixel(final int[][] image, final int x, final int y, final int newColor) {
        image[x][y] = newColor;
    }

    /**
     * 用新颜色填充2D图像
     *
     * @param image 要填充的图像
     * @param x 要填充颜色的x坐标
     * @param y 要填充颜色的y坐标
     * @param newColor 要在图像中填充的新颜色
     * @param oldColor 要在图像中替换的旧颜色
     */
    public static void floodFill(final int[][] image, final int x, final int y, final int newColor, final int oldColor) {
        if (newColor == oldColor || x < 0 || x >= image.length || y < 0 || y >= image[x].length || getPixel(image, x, y) != oldColor) {
            return;
        }

        putPixel(image, x, y, newColor);

        /* 递归检查水平和垂直相邻坐标 */
        floodFill(image, x + 1, y, newColor, oldColor);
        floodFill(image, x - 1, y, newColor, oldColor);
        floodFill(image, x, y + 1, newColor, oldColor);
        floodFill(image, x, y - 1, newColor, oldColor);

        /* 递归检查对角线相邻坐标 */
        floodFill(image, x + 1, y - 1, newColor, oldColor);
        floodFill(image, x - 1, y + 1, newColor, oldColor);
        floodFill(image, x + 1, y + 1, newColor, oldColor);
        floodFill(image, x - 1, y - 1, newColor, oldColor);
    }
}
