蓝桥杯AcWing学习笔记 1-2递推的学习(Java)

}

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. 飞行员兄弟

-±-



-±-

目的:将所有+号变成-

假设切换一下图中圈红的位置,这个绿色的部分就会变成下图所示,它所处的行和列都会变化。

image-20220110162112059

我们发现这个题是很难递推出来的,它跟上一题开关问题不一样,上一题是每一次只会有一个开关能影响灯泡,但是这题是每一个开关可以被很多个开关控制,这一个开关的状态并不会影响到其余开关的操作,因此我们不能用递推的方法来解决这道题。

本题是为了区分上一题,不要固定思想!!这道题没法用递推来解决咱们就直接暴力搜索所有方案。

思想:

枚举所有方案 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;

}

}

}

第四届2013年蓝桥杯真题


AcWing 1208. 翻硬币

C++B组第8题

翻动相邻的两个硬币

输入样例1:

********** // 初始状态

oo // 要达到的目标状态

操作

// 第一步操作

oo********

oo

// 第二步操作

oo******

oo

// 第三步操作

oo****

oo

// 第四步操作

oo**

oo

// 第五步操作

oo

oo

输出样例1

5

这个题其实就是上面费解的开关简化版,能操控灯泡的状态只有一个开关,能操控硬币的正反也只有一个开关,想象两个硬币中有一个开关可以控制两个硬币的正反,绿色的线就是我们的开关。

image-20220111134942132

因为第一个硬币对应的正反就不一样,所以第一个开关我们必须按下,变成下图这样:

image-20220111135144377

第二个开关同理,对比我们想要达到的状态,第二个开关也必须要按,如下图:

image-20220111135256200

以此类推,当我们对比到第6个硬币的时候,发现是一样的,所以第6个开关就一定不能按,之后所有耳朵开关也都不能按。

image-20220111143819015

每个开关按不按的状态是唯一确定的,题中说没有无解的情况,所以这道题必然是只有一种解;一般来说这种问步数的题都是一个优化问题,从所有的解法里找一个最优解,这题看起来是找最小操作步数,但其实我们发现它如果有解的话它只有一种解。

我们只需要把这个问题递推一遍就可以了。

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开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!

如果你觉得这些内容对你有帮助,可以扫码获取!!(备注Java获取)

img

总结

我们总是喜欢瞻仰大厂的大神们,但实际上大神也不过凡人,与菜鸟程序员相比,也就多花了几分心思,如果你再不努力,差距也只会越来越大。实际上,作为程序员,丰富自己的知识储备,提升自己的知识深度和广度是很有必要的。

Mybatis源码解析

《一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码》点击传送门即可获取!
Java获取)**

img

总结

我们总是喜欢瞻仰大厂的大神们,但实际上大神也不过凡人,与菜鸟程序员相比,也就多花了几分心思,如果你再不努力,差距也只会越来越大。实际上,作为程序员,丰富自己的知识储备,提升自己的知识深度和广度是很有必要的。

Mybatis源码解析

[外链图片转存中…(img-VpdTWDNO-1712510160511)]

[外链图片转存中…(img-T4e7Cr2X-1712510160511)]

《一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码》点击传送门即可获取!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值