}
if (res > 6) res = -1;
System.out.println(res);
}
}
// 利用偏移量改变5个位置的值
private static void turn(int x, int y) {
for (int i = 0; i < 5; i++) {
int a = x + dx[i];
int b = y + dy[i];
if (a < 0 || a >= 5 || b < 0 || b >= 5) continue; // 在边界外,直接忽略即可
g[a][b] ^= 1; // 异或运算
}
}
}
AcWing 116. 飞行员兄弟
-±-
-±-
目的:将所有+
号变成-
号
假设切换一下图中圈红的位置,这个绿色的部分就会变成下图所示,它所处的行和列都会变化。
我们发现这个题是很难递推出来的,它跟上一题开关问题不一样,上一题是每一次只会有一个开关能影响灯泡,但是这题是每一个开关可以被很多个开关控制,这一个开关的状态并不会影响到其余开关的操作,因此我们不能用递推的方法来解决这道题。
本题是为了区分上一题,不要固定思想!!这道题没法用递推来解决咱们就直接暴力搜索所有方案。
思想:
枚举所有方案 0~2^16 - 1
按照该方案对所有开关进行操作
判断 => 记录方案
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.List;
public class Main {
static final int N = 5;
static char[][] g = new char[N][N];
static char[][] backup = new char[N][N]; // 备份数组
static BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
public static void main(String[] args) throws Exception {
for (int i = 0; i < 4; i++) g[i] = in.readLine().toCharArray();
List res = new ArrayList<>();
for (int op = 0; op < 1 << 16; op++) { // 1 << 16 同等于2^16
List temp = new ArrayList<>();
for (int i = 0; i < 4; i++) {
backup[i] = g[i].clone(); // 备份
}
// 进行操作
for (int i = 0; i < 4; i++) {
for (int j = 0; j < 4; j++) {
if ((op >> get(i, j) & 1) == 1) {
temp.add(new PII(i, j));
turn_all(i, j);
}
}
}
// 判断所有灯泡是否全亮
boolean has_closed = false;
for (int i = 0; i < 4; i++) {
for (int j = 0; j < 4; j++) {
if (g[i][j] == ‘+’) has_closed = true;
}
}
if (has_closed == false) {
if (res.isEmpty() || res.size() > temp.size()) res = temp;
}
for (int i = 0; i < 4; i++) {
g[i] = backup[i].clone(); // 还原
}
}
System.out.println(res.size());
for (PII p : res) System.out.println((p.x + 1) + " " + (p.y + 1));
in.close();
}
private static void turn_all(int x, int y) {
for (int i = 0; i < 4; i++) {
turn_one(x, i);
turn_one(i, y);
}
turn_one(x, y);
}
private static void turn_one(int x, int y) {
if (g[x][y] == ‘+’) g[x][y] = ‘-’;
else g[x][y] = ‘+’;
}
/*
返回矩阵中数的位数
0 1 2 3
4 5 6 7
8 9 10 11
12 13 14 15
*/
private static int get(int x, int y) {
return 4 * x + y;
}
static class PII {
int x;
int y;
public PII (int x, int y) {
this.x = x;
this.y = y;
}
}
}
AcWing 1208. 翻硬币
C++B组第8题
翻动相邻的两个硬币
输入样例1:
********** // 初始状态
oo // 要达到的目标状态
操作
// 第一步操作
oo********
oo
// 第二步操作
oo******
oo
// 第三步操作
oo****
oo
// 第四步操作
oo**
oo
// 第五步操作
oo
oo
输出样例1
5
这个题其实就是上面费解的开关简化版,能操控灯泡的状态只有一个开关,能操控硬币的正反也只有一个开关,想象两个硬币中有一个开关可以控制两个硬币的正反,绿色的线就是我们的开关。
因为第一个硬币对应的正反就不一样,所以第一个开关我们必须按下,变成下图这样:
第二个开关同理,对比我们想要达到的状态,第二个开关也必须要按,如下图:
以此类推,当我们对比到第6个硬币的时候,发现是一样的,所以第6个开关就一定不能按,之后所有耳朵开关也都不能按。
每个开关按不按的状态是唯一确定的,题中说没有无解的情况,所以这道题必然是只有一种解;一般来说这种问步数的题都是一个优化问题,从所有的解法里找一个最优解,这题看起来是找最小操作步数,但其实我们发现它如果有解的话它只有一种解。
我们只需要把这个问题递推一遍就可以了。
import java.util.Scanner;
public class Main {
static final int N = 101;
static char[] s1 = new char[N];
static char[] s2 = new char[N];
public static void main(String[] args) {
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。
深知大多数Java工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《2024年Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,真正体系化!
由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!
如果你觉得这些内容对你有帮助,可以扫码获取!!(备注Java获取)
总结
我们总是喜欢瞻仰大厂的大神们,但实际上大神也不过凡人,与菜鸟程序员相比,也就多花了几分心思,如果你再不努力,差距也只会越来越大。实际上,作为程序员,丰富自己的知识储备,提升自己的知识深度和广度是很有必要的。
Mybatis源码解析
《一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码》,点击传送门即可获取!
Java获取)**
总结
我们总是喜欢瞻仰大厂的大神们,但实际上大神也不过凡人,与菜鸟程序员相比,也就多花了几分心思,如果你再不努力,差距也只会越来越大。实际上,作为程序员,丰富自己的知识储备,提升自己的知识深度和广度是很有必要的。
Mybatis源码解析
[外链图片转存中…(img-VpdTWDNO-1712510160511)]
[外链图片转存中…(img-T4e7Cr2X-1712510160511)]
《一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码》,点击传送门即可获取!