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

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;
}

相关文章:

  • pytest源码分析之pluggy源码分析一
  • 支持 40+ 插件,Spring AI Alibaba 简化智能体私有数据集成
  • 【博资考3】网安学院-北航网安基础部分(详细版本)
  • 鹏哥c语言数组(初阶数组)
  • QT线程同步
  • 《白帽子讲Web安全》爬虫对抗:技术演进与攻防博弈
  • 【PyTorch】torch.distributed.elastic.multiprocessing.errors.ChildFailedError:
  • 创建数据库完成后需要进行对数据库添加空间扩展
  • 【变化:海平面上升,城市下沉 关键字摘要】
  • 自定义提交按钮触发avue-form绑定的submit事件
  • TMDS视频编解码算法
  • OpenIPC开源FPV之Adaptive-Link安装
  • MongoDB私人学习笔记
  • (Arrow)时间处理变得更简单
  • Git最佳实践指南(Windows/Linux双系统详解)
  • 【Ambari】Ranger KMS
  • P5782 [POI 2001] 和平委员会 2-SAT
  • 系统调用过程
  • nv docker image 下载与使用命令备忘
  • MySQL-增删改查
  • 个人开办导航网站需要怎么做/怎么注册个人网站
  • 泰州做网站的/百度搜索关键词推广
  • 科泉网站/百度的合作网站有哪些
  • 淘宝天猫优惠券网站怎么做/百度统计数据
  • 网站运行维护/昆明seo案例
  • 可以查企业备案的网站/武汉疫情最新动态