蓝桥杯——17

学习视频:18-深搜的剪枝策略练习_哔哩哔哩_bilibili

Q:找数字

#include<iostream>
#include<cstring>
using namespace std;
int n;
bool ok;
void dfs(int num, int cnt) {
	if (cnt >= 19) {
		return;
	}
	if (ok) {
		return;
	}
	if (num % n == 0) {
		ok = true;
		cout << num;
		return;
	}
	dfs(num * 10 + 0, cnt + 1);
	dfs(num * 10 + 1, cnt + 1);
}

int main() {
	cin >> n;
	dfs(1, 1);
	return 0;
}

Q:全排列

#include<iostream>
#include<vector>
using namespace std;
int n;
int m = 1;
int a[12];
vector<int> temp;
bool vis[12];
void dfs(int c) {
	if (c == n) {
		for (int i = 0; i < temp.size(); i++) {
			cout << temp[i];
		}
		cout << '\n';
		return;
	}
	for (int i = 1; i <= n; i++) {
		if (!vis[i]) {
			vis[i] = true;
			temp.push_back(i);
			dfs(c + 1);
			temp.pop_back();
			vis[i] = false;
		}

	}


}

int main() {
	cin >> n;
	for (int i = 1; i <= n; i++) {
		a[i] = i;
		m *= i;
	}
	cout << '\n';
	cout << m << endl;
	dfs(0);
	
	return 0;
}
/*
4
*/

Q:蒜头军的旅游计划

#include<iostream>
#include<vector>
using namespace std;
int n;
int city[20][20];
bool vis[20];
int sum = 150000;
void dfs(int pos, int cnt, int s) {
	if (s >= sum) {
		return;
	}
	if (cnt == n) {
		s += city[pos][1];
		if (s < sum)
			sum = s;
		return;
	}
	for (int i = 1; i <= n; i++) {
		if (i != pos && !vis[i]) {
			vis[i] = true;
			dfs(i, cnt + 1, s + city[pos][i]);
			vis[i] = false;
		}
	}

}
int main() {
	cin >> n;
	for (int i = 1; i <= n; i++) {
		for (int j = 1; j <= n; j++) {
			cin >> city[i][j];
		}
	}
	vis[1] = true;
	dfs(1, 1, 0);
	cout << sum << endl;
	return 0;
}
/*
4
0 1 1 1
1 0 2 1
5 5 0 6
1 1 3 0
*/

Q:正方形

#include<iostream>
#include<vector>
using namespace std;
int n;
int goal;
int p[25];
bool ok;
bool vis[25];
void dfs(int cnt, int len) {
	if (cnt == 4) {
		ok = true;
		return;
	}
	if (ok) {
		return;
	}
	if (len > goal) {
		return;
	}
	if (len == goal) {
		dfs(cnt + 1, 0);
		return;
	}
	for (int i = 0; i < n; i++) {
		if (!vis[i]) {
			vis[i] = true;
			dfs(cnt, len + p[i]);
			vis[i] = false;
		}
	}

}

int main() {
	cin >> n;
	int sum = 0;
	for (int i = 0; i < n; i++) {
		cin >> p[i];
		sum += p[i];
	}
	if (sum % 4 == 0) {
		goal = sum / 4;
		dfs(0, 0);
		if (ok)
			cout << "Ok" << endl;
		else
			cout << "No" << '\n';
	}
	else {
		cout << "No" << endl;
	}
	return 0;
}
/*
4
1 1 1 1
*/

Q:因数最多的数

太难了,听不懂

Q:置换的玩笑

#include<iostream>
#include<string>
using namespace std;
string s;
int ch[60];
int n;
bool ok;
bool vis[60];
void dfs(int u,int cnt) {
	if (ok)
		return;
	if (u == s.size()) {
		for (int i = 0; i < n; i++) {
			cout << ch[i] << " ";
		}
		cout << '\n';
		ok = true;
		return;
	}
	int x = s[u] - '0';
	if (x < n && !vis[x]) {
		ch[cnt] = x ;
		vis[x] = true;
		dfs(u + 1, cnt + 1);
		vis[x] = false;
	}
	if (u >= s.size() - 1)return;
	x = x * 10 + s[u + 1] - '0';
	if (x <= n && !vis[x]) {
		ch[cnt] = x ;
		vis[x] = true;
		dfs(u + 2, cnt + 1);
		vis[x] = false;
	}
}

int main() {
	cin >> s; 
	n = s.size() <= 9 ? s.size() : (s.size() - 9) / 2 + 9;
	dfs(0, 0);
	return 0;
}
/*
4111109876532
*/

Q:Betsy的旅行

#include<iostream>
using namespace std;
int n;
int ans = 0;
bool vis[8][8];
int dir[4][2] = { {0,1},{0,-1},{-1,0},{1,0} };
void dfs(int x, int y, int step) {
	if (x == n - 1 && y == 0) {
		if (step == n * n)
			ans++;
		return;
	}
	if (step >= n * n)
		return;
	vis[x][y] = true;
	for (int i = 0; i < 4; i++) {
		int fx = x + dir[i][0];
		int fy = y + dir[i][1];
		if (fx >= 0 && fx < n && fy >= 0 && fy < n && !vis[fx][fy]) {
			dfs(fx, fy, step + 1);
		}
	}

	vis[x][y] = false;
}
int main() {
	cin >> n;
	dfs(0, 0, 1);
	cout << ans << endl;
	return 0;
}

Q:方块消消乐

不会,放弃

————————————————————————————————

学习视频:19-广度优先搜索视频讲解_哔哩哔哩_bilibili

S:数据结构——队列

先进先出,队首出,队尾插入

操作:push入队、pop出队、empty是否空、size元素个数、front访问队首元素

引用:

#include<queue>
queue<int> q;

手动清空:

while(!p.empty()){
    p.pop();
}

使用:

#include<iostream>
#include<queue>
using namespace std;
int main() {
	queue<string> q;
	q.push("hanxiaolu");
	q.push("tianmeng");
	while (!q.empty()) {
		cout << q.front() << '\n';
		q.pop();
	}
	return 0;
}

Q:报数游戏

#include<iostream>
#include<queue>
using namespace std;
int main() {
	int n, m;
	cin >> n >> m;
	queue<int> q;
	int a = 1;
	for (int i = 0; i < n; i++) {
		q.push(i + 1);
	}
	int tmp;
	while (q.size() > 1) {
		if (a == 5) {
			q.pop();
			a = 1;
		}
		else {
			tmp = q.front();
			q.pop();
			q.push(tmp);
			a++;
		}
	}
	cout << q.front();
	return 0;
}

S:

广度优先搜索BFS

求最短路的经常用BFS

Q:迷宫游戏

#include<iostream>
#include<queue>
using namespace std;
int n, m;
char maze[10][10];
bool vis[10][10];
int dir[4][2] = { {-1,0},{1,0},{0,1},{0,-1} };
struct node {
	int x, y, d;
	node(int xx, int yy, int dd) {
		x = xx;
		y = yy;
		d = dd;
	}
};
bool in(int x, int y) {
	return x >= 0 && x < n && y >= 0 && y < m;
}
int bfs(int sx, int sy) {
	queue<node> q;
	q.push(node(sx, sy, 0));   //先放进去一个初始的节点
	vis[sx][sy] = true;
	while (!q.empty()) {   //循环条件是不空
		node now = q.front();  //定义新节点后删除
		q.pop();
		for (int i = 0; i < 4; i++) {  //遍历四个方向
			int fx = now.x + dir[i][0];
			int fy = now.y + dir[i][1];
			if (in(fx, fy) && !vis[fx][fy] && maze[fx][fy] != '*') {//条件筛选
				if (maze[fx][fy] == 'T') {  //终止条件
					return now.d + 1;
				}
				else { //继续放小的
					vis[fx][fy] = true;
					q.push(node(fx, fy, now.d + 1));
				}
			}
	}
	return -1;
}
int main() {
	cin >> n >> m;
	for (int i = 0; i < n; i++) {
		cin >> maze[i];
	}
	int x, y;
	for (int i = 0; i < n; i++) {
		for (int j = 0; j < m; j++) {
			if (maze[i][j] == 'S')
				x = i, y = j;		}
	}
	cout << bfs(x, y) << '\n';
	return 0;
}
/*
5 6
....S*
.**...
.*..*.
*..**.
.T....
*/

Q:一维坐标的移动

#include<iostream>
#include<queue>
using namespace std;
queue<pair<int,int>> q;
bool vis[5005];

int main() {
	int n, A, B, now, step;
	cin >> n >> A >> B;
	q.push(make_pair(A, 0));//结构体也可以
	vis[A] = true;
	while (!q.empty()) {
		now = q.front().first;
		step = q.front().second;
		q.pop();
		if (now == B) {   //终止条件
			cout << step;
			break;
		}
		if (now + 1 <= n && !vis[now + 1]) {//下一个没有访问过并且未越界
			q.push(make_pair(now + 1, step + 1));
			vis[now + 1] = true;
		}
		if (now - 1 >= 0 && !vis[now - 1]) {
			q.push(make_pair(now - 1, step + 1));
			vis[now - 1] = true;
		}
		if (now * 2 <= n && !vis[now * 2]) {
			q.push(make_pair(now * 2, step + 1));
			vis[now * 2] = true;
		}
	}

	return 0;
}

  • 5
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
在Java中,带分数可以用分数类来表示。下面是一个简单的带分数类的实现: ```java public class Fraction { private int integer; private int numerator; private int denominator; public Fraction(int integer, int numerator, int denominator) { this.integer = integer; this.numerator = numerator; this.denominator = denominator; simplify(); } private void simplify() { if (numerator < 0 && denominator < 0) { numerator = -numerator; denominator = -denominator; } if (denominator < 0) { numerator = -numerator; denominator = -denominator; } if (integer < 0 && numerator > 0) { numerator = -numerator; } if (integer < 0 && numerator == 0) { integer = -integer; } if (numerator >= denominator) { integer += numerator / denominator; numerator = numerator % denominator; } int gcd = gcd(numerator, denominator); numerator /= gcd; denominator /= gcd; } private int gcd(int a, int b) { if (b == 0) { return a; } return gcd(b, a % b); } public Fraction add(Fraction other) { int newNumerator = this.numerator * other.denominator + other.numerator * this.denominator; int newDenominator = this.denominator * other.denominator; int newInteger = this.integer + other.integer; return new Fraction(newInteger, newNumerator, newDenominator); } public String toString() { if (integer == 0 && numerator == 0) { return "0"; } String result = ""; if (integer != 0) { result += integer; if (numerator != 0) { result += "_"; } } if (numerator != 0) { result += numerator + "/" + denominator; } return result; } } ``` 这个带分数类实现了以下功能: - 构造函数可以根据整数部分、分子和分母创建一个带分数对象。 - simplify() 方法可以将带分数对象化简,如将负号移到分子上、将整数部分和真分数部分合并、将分数化简等。 - add() 方法可以将两个带分数对象相加,返回一个新的带分数对象。 - toString() 方法可以将带分数对象转换为字符串形式。 这个类实现了带分数的加法操作,可以参考这个类来实现其他的运算操作。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

晓晓hh

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值