当前位置: 首页 > article >正文

2.25DFS和BFS刷题

洛谷P1101单词方阵:用sta存字符串,for找到‘y'的位置,然后dfs对字符串用for进行一个一个的判断,不符合就return,下面再用for进行book标记,能执行下面的for说明上面没有return,所以说明找到,book标记字符串长度就行,然后for+if判断book为true就输出,不然就输出*就行。

#include<iostream>
#include<cstring>
using namespace std;
const int N = 105;
int n;
string sta = "yizhong";
char ch[N][N];
bool book[N][N];
int dx[8] = {0, 0, 1, -1, 1, -1, 1, -1}, dy[8] = {1, -1, 0, 0, 1, -1, -1, 1};
void dfs(int x, int y, int xd, int yd){
	int a = x + xd, b = y + yd;
	for(int i = 1; i < 7; i++){
		if(sta[i] != ch[a][b])return;
		a += xd;
		b += yd;
	}
	for(int i = 0; i < 7; i++){
		book[x][y] = true;
		x += xd;
		y += yd;
	} 
}
int main(){
	cin >> n;
	for(int i = 1; i <= n; i++){
		for(int j = 1; j <= n; j++){
			cin >> ch[i][j];
		}
	}
	for(int i = 1; i <= n; i++){
		for(int j = 1; j <= n; j++){
			if(ch[i][j] == 'y'){
				for(int k = 0; k < 8; k++) dfs(i, j, dx[k], dy[k]);
			} 
		} 
	}
	for(int i = 1; i <= n; i++){
		for(int j = 1; j <= n; j++){
			if(book[i][j]) cout << ch[i][j];
			else cout << '*' ;
		}
		cout << endl;
	}
	
	return 0;
}

洛谷P2404自然数的拆分问题:DFS

#include<iostream>
using namespace std;
int n, m;
int p[15] = {1};
void dfs(int x){
	for(int i = p[x - 1]; i <= m; i++){
		if(i == n)continue;
		p[x] = i;
		m -= i;
		if(m == 0){
			for(int j = 1; j < x; j++){
				cout << p[j] << '+';
			}
			cout << p[x] << endl;
		}
		else dfs(x + 1);
		m += i;
	}
}
int main(){
	cin >> n;
	m = n;
	dfs(1);
	
	return 0;
}

洛谷P1596一道BFS,求连通块数量。

#include<iostream>
#include<queue>
using namespace std;
const int N = 105;
int n, m;
bool st[N][N];
char ch[N][N];
int ans;
int dx[8] = {0, 0, 1, -1, 1, -1, 1, -1};
int dy[8] = {1, -1, 0, 0, 1, -1, -1, 1};
typedef pair<int, int> PII;
void bfs(int a, int b){
	queue<PII> q;
	q.push({a, b});
	st[a][b] = true;
	while(q.size()){
		auto t = q.front();
		q.pop();
		int x = t.first, y = t.second;
		for(int i = 0; i < 8; i++){
			int xx = x + dx[i], yy = y + dy[i];
			if(xx >= 1 && xx <= n && yy >= 1 && yy <= m && !st[xx][yy] && ch[xx][yy] == 'W'){
				st[xx][yy] = true;
				q.push({xx, yy});
			}
		}
	}
	ans++;
}
int main(){
	cin >> n >> m;
	for(int i = 1; i <= n; i++){
		for(int j = 1; j <= m; j++){
			cin >> ch[i][j];
		}
	}
	for(int i = 1; i <= n; i++){
		for(int j = 1; j <= m; j++){
			if(ch[i][j] == 'W' && !st[i][j])bfs(i, j);
		}
	}
	cout << ans << endl;
	return 0;
}

洛谷P1162填色:相当于围墙加水,里面的是水也就是2, 外面的为0,外面从0,0开始把围墙外的数通过BFS都给标记成3,然后是3就输出0,原来的围墙1不变,然后围墙里面本来是0,的就输出2。

#include<iostream>
#include<queue>
using namespace std;
const int N = 35;
int a[N][N];
int n;
bool st[N][N];
int dx[4] = {0, 0, 1, -1}, dy[4] = {1, -1, 0, 0};
typedef pair<int, int> PII; 
void bfs(){
	queue<PII> q;
	q.push({0, 0});
	st[0][0] = true;
	while(q.size()){
		auto t = q.front();
		q.pop();
		int x = t.first, y = t.second;
		for(int i = 0; i < 4; i++){
			int xx = x + dx[i], yy = y + dy[i];
			if(xx >= 0 && xx <= n + 1 && yy >= 0 && yy <= n + 1 && !st[xx][yy] && a[xx][yy] == 0){
				a[xx][yy] = 3;
				st[xx][yy] = true;
				q.push({xx, yy});
			}
		}
	}
}
int main(){
	cin >> n;
	for(int i = 1; i <= n; i++){
		for(int j = 1; j <= n; j++){
			cin >> a[i][j];
		}
	}
	bfs();
	for(int i = 1; i <= n; i++){
		for(int j = 1; j <= n; j++){
			if(a[i][j] == 3) cout << 0 << ' ';
			else if(a[i][j] == 1) cout << 1 << ' ';
			else cout << 2 << ' '; 
		}
		cout << endl;
	}
	return 0;
}


http://www.kler.cn/a/561738.html

相关文章:

  • Windows cmd 的没有下划线怎么办
  • 基于 SpringBoot Vue 的生鲜商城系统设计和实现(源码+文档+部署讲解)
  • Spring MVC 的执行流程解析:从用户请求到响应返回
  • github 部署前端静态网页(react vite)
  • 理解 SQL Server 锁粒度:优化并发性能与数据一致性
  • 微信小程序源码逆向 MacOS
  • 容器技术对传统配置管理工具痛点的补充
  • Deepseek 实战全攻略,领航科技应用的深度探索之旅
  • MFC—加法器
  • spark 虚拟机基本命令(2)
  • 从 Linux 服务器到前端到网关到后端业务逻辑的分析
  • 深度剖析Seata源码:解锁分布式事务处理的核心逻辑
  • 如何安全使用短脉冲红外激光器防止激光辐射伤害的方法
  • jspssm526springboot 教师人事档案管理系统
  • 芯旺微KF32A156芯片CANFD过滤配置
  • JavaScript的BOM编程
  • 【NLP算法面经】腾讯、头条算法岗详细面经(★附面题整理★)
  • MFC案例:利用双缓冲技术绘制顶点可移动三角形
  • 【新算法】基于Transformer-LSTM-Adaboost的多输入单输出回归预测模型【MATLAB】
  • 去中心化技术P2P框架