蓝桥杯练习11:费解的开关

费解的开关

在这里插入图片描述 在这里插入图片描述在这里插入图片描述思路:类似于熄灯问题:JAVA实现



import java.util.Scanner;

public class Main {
	//用来遍历按钮四个方向,注意数组位置和在坐标系是不同的
	//原地,左右上下
	static int[] dx = { 0, 0, 0, -1, 1 };
	static int[] dy = { 0, -1, 1, 0, 0 };

	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		int n = sc.nextInt();
		char[][] light = new char[5][5];
		for (int i = 0; i < n; i++) {
			for (int j = 0; j < 5; j++) {
				light[j] = sc.next().toCharArray();
			}
			System.out.println(work(light));

		}

	}

	static int work(char[][] light) {
		int min = Integer.MAX_VALUE;
		char[][] map = new char[5][5];
		for (int i = 0; i < (1 << 5); i++) {
			for (int j = 0; j < 5; j++) {
				for (int k = 0; k < 5; k++) {
				//注意,JAVA对二维数组的clone是浅拷贝,即把数组地址公用,如果直接使用
				//char[][] map=light.clone(),对这两个数组任意一个改变都会直接同时改变另一个的值
					map[j][k] = light[j][k];
				}
			}
			int res = 0;

			for (int j = 0; j < 5; j++) {
				if (((i >> j) & 1) == 1) {
					res += 1;
					turn(0, j, map);
				}
			}
			for (int j = 0; j < 4; j++) {
				for (int k = 0; k < 5; k++) {
					if (map[j][k] == '0') {
						res += 1;
						turn(j + 1, k, map);
					}
				}
			}
			boolean isOK = true;
			for (int j = 0; j < 5; j++) {
				if (map[4][j] == '0') {
					isOK = false;
					break;
				}
			}
			if (isOK) {
				min = Math.min(res, min);
			}
		}
        if(min>6) return -1;
		return min;
	}

	private static void turn(int i, int j, char[][] map) {
		for (int n = 0; n < 5; n++) {
			int x = i + dx[n];
			int y = j + dy[n];
			if (x >= 0 && x < 5 && y >= 0 && y < 5) {
				map[x][y] ^= 1;
			}
		}

	}

}

发布了41 篇原创文章 · 获赞 1 · 访问量 1431

猜你喜欢

转载自blog.csdn.net/qq_44467578/article/details/104332389