蓝桥杯C++大学B组一个月冲刺记录2024/3/1
规则:每日三题
今日发烧状态,就这样吧
1.递归实现组合型枚举
从 1∼n这 n个整数中随机选出 m个,输出所有可能的选择方案。
我的理解就是在dfs的过程中,确保答案是严格单调递增的
所以在放入数之前,保证放入的这个数是大于上一个位置的数的
#include<cstdio>
#include<iostream>
using namespace std;
int n,m;
const int MAx = 30;
int pos[MAx];
bool st[MAx];
void dfs(int u){
if(u > m){
for(int i = 1;i <= m; ++i) cout << pos[i] << ' ';
cout << '\n';
return;
}
for(int i = 1;i <= n;++i){
if(!st[i] && i > pos[u-1]){
pos[u] = i;
st[i] = true;
dfs(u+1);
st[i] = false;
}
}
}
int main(){
cin >> n >> m;
dfs(1);
return 0;
}
2.接龙数列
dp,和最长上升子序列做对比
#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
int n;
int g[10];
int main()
{
cin >> n;
int res = 0;
char num[20];
for (int i = 0; i < n; i ++ )
{
cin >> num
int l = num[0] - '0', r = num[strlen(num) - 1] - '0';
int f = max(1, g[l] + 1);
g[r] = max(g[r], f);
res = max(res, f);
}
cout << res << endl;
return 0;
}
3.岛屿个数
双bfs,一个用来染色,一个用来判断是否逃脱至边界
#include<iostream>
#include<cstring>
#include<queue>
#include<vector>
using namespace std;
typedef pair<int,int>PII;
const int N = 55;
char p[N][N];
int col[N][N];
int idx = 0;
vector<PII>pos;
int dx[] = {1,0,-1,0,1,1,-1,-1};
int dy[] = {0,1,0,-1,1,-1,1,-1};
int T,m,n;
void bfs(int i,int j){
idx ++;
col[i][j] = idx;
queue<PII>q;
q.push({i,j});
while(q.size() != 0){
auto t = q.front();
q.pop();
int x = t.first;
int y = t.second;
for(int k = 0;k < 4;++ k){
int xx = x + dx[k];
int yy = y + dy[k];
if(xx>=0&&xx<m&&yy>=0&&yy<n&&col[xx][yy] == 0&&p[xx][yy] == '1'){
q.push({xx,yy});
col[xx][yy] = idx;
}
}
}
return;
}
bool escape(int i,int j){
queue<PII>q;
int ff[N][N];
memset(ff,0,sizeof(ff));
q.push({i,j});
while(q.size()!=0){
auto t = q.front();
q.pop();
int x = t.first;
int y = t.second;
for(int k = 0;k < 8;++k){
int xx = x + dx[k];
int yy = y + dy[k];
if(xx < 0||yy < 0||xx >= m||yy >=n) return true;
else{
if(p[xx][yy] == '0'&&ff[xx][yy] == 0){
ff[xx][yy] = 1;
q.push({xx,yy});
}
}
}
}
return false;
}
int main(){
cin >> T;
while(T--){
memset(col,0,sizeof(col));
idx = 0;
pos.clear();
cin >> m >> n;
for(int i = 0;i < m;++i) cin >> p[i];
for(int i = 0;i < m;++i){
for(int j = 0;j < n;++j){
if(col[i][j] == 0&&p[i][j] == '1'){
bfs(i,j);
pos.push_back({i,j});
}
}
}
int ans = idx;
for(auto item:pos){
if(!escape(item.first,item.second)){
ans--;
}
}
cout << ans << endl;
}
return 0;
}