一、一步之遥
题目链接:一步之遥 - 蓝桥云课 (lanqiao.cn)
题目要求:
一步之遥
从昏迷中醒来,小明发现自己被关在 X 星球的废矿车里。 矿车停在平直的废弃的轨道上。 他的面前是两个按钮,分别写着 “F” 和 “B”。
小明突然记起来,这两个按钮可以控制矿车在轨道上前进和后退。 按 F,会前进 97 米。按 B 会后退127 米。 透过昏暗的灯光,小明看到自己前方 1 米远正好有个监控探头。 他必须设法使得矿车正好停在摄像头的下方,才有机会争取同伴的援助。 或许,通过多次操作 F 和 B 可以办到。
矿车上的动力已经不太足,黄色的警示灯在默默闪烁... 每次进行 F 或 B 操作都会消耗一定的能量。 小明飞快地计算,至少要多少次操作,才能把矿车准确地停在前方 1 米远的地方。
请问为了达成目标,最少需要操作的次数是多少。
解题思路:
直接模拟选最小的就行。
#include <bits/stdc++.h> using namespace std; int main() { int num = INT_MAX; for(int i=0;i<100;i++) { for(int j=0;j<100;j++) { if(97*i-127*j==1) { num = min(num,i+j); } } } cout<<num; return 0; }
二、方格分割(dfs)
题目链接:方格分割 - 蓝桥云课 (lanqiao.cn)
题目要求:
6x6的方格,沿着格子的边线剪开成两部分。 要求这两部分的形状完全相同。
如下就是三种可行的分割法。
试计算:包括这 3 种分法在内,一共有多少种不同的分割方法。 注意:旋转对称的属于同一种分割法。
解题思路:
首先切割线一定会经过图的中心点,只要确定半条到达边界的分割线,就能根据这半条对称画出另外半条。另外,题目要求旋转对称属于同一种分割法,因为结果是中心对称的,搜索出来的个数除以 4 即可。具体操作是:中心点是 (3, 3) 从 (3, 3) 出发,向右、向左、向上、向下,四个方向 DFS 即可
#include<bits/stdc++.h> using namespace std; int X[] = {0, -1, 1, 0, 0}; int Y[] = {0, 0, 0, -1, 1}; bool vis[10][10]; int res = 0; void dfs(int x, int y) { if(x == 0 || y == 0 || x == 6 || y == 6) { res++; return ; } for(int i = 1 ; i <= 4 ; i++) { x += X[i]; y += Y[i]; if(!vis[x][y]) { vis[x][y] = true; vis[6 - x][6 - y] = true; dfs(x, y); vis[6 - x][6 - y] = false; vis[x][y] = false; } x -= X[i]; y -= Y[i]; } } int main() { vis[3][3] = true; dfs(3, 3); cout << res / 4 << endl; return 0; }