一、 队列
1、简单模拟队列排列
#include<bits/stdc++.h>
using namespace std;
int main(){int n;cin>>n;queue<int>q;string str;while(true){cin>>str;if(str=="#")break;if(str=="In"){int t;cin>>t;if(q.size()<n){q.push(t);cout<<t<<"joined. Total:"<<q.size()<<endl;}else{cout<<t<<" rejected."<<endl;}}if(str=="Calling"){if(q.empty()){cout<<"No one"<<endl;}else{int t=q.front();q.pop();cout<<t<<"called. Total:"<<q.size()<<endl;}}}return 0;
}
2、约瑟夫问题
#include<bits/stdc++.h>
using namespace std;
int main(){int n,m;cin>>n>>m;queue<int>q;for(int i=1;i<=n;i++){q.push(i);}int i=1;while(!q.empty()){if(i==m){cout<<q.front()<<endl;q.pop();i=1;}else{q.push(q.front());q.pop();i=i+1;}}return 0;
}
3、周末舞会
#include<bits/stdc++.h>
using namespace std;
int main(){int boy,girl,k;cin>>boy>>girl>>k;queue<int>b_q,g_q;for(int i=1;i<=boy;i++){b_q.push(i);}for(int i=1;i<=girl;i++){g_q.push(i);}while(k--){int x,y;x=b_q.front();b_q.pop();y=g_q.front();g_q.pop();cout<<x<<" "<<y<<endl;b_q.push(x),g_q.push(y);}return 0;
}
4、围圈报数
#include<bits/stdc++.h>
using namespace std;
int main(){int n,m;cin>>n>>m;queue<int>q;for(int i=1;i<=n;i++){q.push(i);}while(!q.empty()){int x;for(int i=1;i<=m-1;i++){x=q.front();q.pop();q.push(x);}x=q.front();q.pop();cout<<x<<endl;}return 0;
}
5、小孩报数
#include<bits/stdc++.h>
using namespace std;
int main(){int n,m;cin>>n>>m;queue<int>q;if(n>10){return 1;}for(int i=1;i<=n;i++){char name;cin>>name;q.push(name);}while(!q.empty()){for(int i=1;i<=m-1;i++){char t=q.front();q.pop();q.push(t);}char t=q.front();q.pop();cout<<t<<endl;}return 0;
}
6、十进制转二进制
#include<bits/stdc++.h>
using namespace std;
int main(){int n;cin>>n;if(n<0){cout<<0<<endl;return 0;}int a[45];int idx=0;while(n>0){a[idx]=n%2;n=n/2;idx++;}for(int i=idx-1;i>=0;i--){cout<<a[i];}cout<<endl;return 0;
}
二、栈、二叉树
1、出入栈
#include<bits/stdc++.h>
using namespace std;
bool bmg(string str){stack<char>s;int t=0;for(int i=0;i<str.length();i++){char c=str[i];while(s.empty()||s.top()!=c){if(t>=26)return false;s.push('a'+t);t++;}s.pop();}return true;
}
int main(){int n;cin>>n;for(int i=0;i<n;i++){string str;cin>>str;if(bmg(str)){cout<<"yes"<<endl;}else{cout<<"no"<<endl;}}return 0;
}
2、最短路径迪杰斯特拉算法
#include<bits/stdc++.h>
using namespace std;
const int N=105;
const int INF=1e9;
int vis[N];
int dis[N];
int a[N][N];
int vexnum;
void dij(int u,int v){for(int i=0;i<vexnum;i++){vis[i]=0;dis[i]=a[u][i];}vis[u]=1;for(int i=0;i<vexnum-1;i++){int minn=INF;int t;for(int j=0;j<vexnum;j++){if(vis[j]==0&&dis[j]<minn){minn=dis[j];}}vis[t]=1;for(int j=0;j<vexnum;j++){if(vis[j]==0&&dis[t]+a[t][j]<dis[j]){dis[j]=dis[t]+a[t][j];}}}cout<<dis[v];
}
int main(){int n,m;cin>>n>>m;vexnum=n;for(int i=0;i<n;i++){for(int j=0;j<n;j++){if(i==j){a[i][j]=0;}else{a[i][j]=INF;}}}for(int i=1;i<=m;i++){int u,v,w;cin>>u>>v>>w;a[u][v]=w;}int p;cin>>p;dij(0,p);return 0;
}
3、公路村村通
#include<bits/stdc++.h>
using namespace std;
const int N=1e3+5;
struct node{int start;int end;int weight;
}a[N];;
int n,m;
int parent[N];
bool cmp(node a,node b){return a.weight<b.weight;
}
int find(int x){if(parent[x]!=x){x=find(parent[x]);}return parent[x];
}
int main(){cin>>n>>m;for(int i=0;i<m;i++){cin>>a[i].start>>a[i].end>>a[i].weight;}sort(a,a+m,cmp);for(int i=1;i<=n;i++){parent[i]=i;}int cnt1=0;//总权重 int cnt2=0;//变得数量 for(int i=1;i<=n;i++){int r1=find(a[i].start);int r2=find(a[i].end);if(r1!=r2){parent[r2]=r1;cnt1+=a[i].weight;cnt2++;if(cnt2==n-1)break;}}if(cnt2==n-1){cout<<cnt1<<endl;}else{cout<<-1<<endl;}return 0;
}
4、繁忙的都市
#include<bits/stdc++.h>
using namespace std;
const int N=1e4+5;
struct node{int start;int end;int weight;
}a[N];
int n,m;
int b[N];
bool cmp(node a,node b){return a.weight<b.weight;
}
int find(int x){while(b[x]!=x){b[x]=b[b[x]];x=b[x];}return x;
}
void unite(int x,int y){int fx=find(x);int fy=find(y);if(fx!=fy){b[fx]=fy;}
}
int main(){cin>>n>>m;for(int i=0;i<m;i++){int u,v,w;cin>>u>>v>>w;a[i]={u,v,w};}sort(a,a+m,cmp);for(int i=1;i<=n;i++){b[i]=i;}int cnt=0,max_c=0;for(int i=0;i<m;i++){int u=a[i].start;int v=a[i].end;if(find(u)!=find(v)){unite(u,v);cnt++;max_c=a[i].weight;if(cnt==n-1)break;}}cout<<cnt<<" "<<max_c<<endl;return 0;
}
5、局域网
#include<bits/stdc++.h>
using namespace std;
const int N=1e3+5;
struct node{int u;int v;int w;
}a[N];
int n,m;
int b[N];
bool cmp(node a,node b){return a.w<b.w;
}
int find(int x){while(b[x]!=x){b[x]=b[b[x]];x=b[x];}return x;
}
int main(){cin>>n>>m;int sum1=0;for(int i=0;i<m;i++){int u,v,w;cin>>u>>v>>w;a[i]={u,v,w};sum1++;}sort(a,a+m,cmp);for(int i=1;i<=n;i++){b[i]=i;}int sum2=0,cnt=0;for(int i=0;i<m;i++){int u=a[i].u;int v=a[i].v;int w=a[i].w;int r_u=find(u);int r_v=find(v);if(r_u!=r_v){b[r_u]=r_v;sum2+=w;cnt++;if(cnt==n-1)break;}}cout<<sum1-sum2<<endl;return 0;
}
三。排序插入、查找
1、插入排序
#include<bits/stdc++.h>
using namespace std;
const int N=1e3+5;
int a[N];
int n;
int main(){cin>>n;for(int i=1;i<=n;i++){cin>>a[i];}for(int i=1;i<=n;i++){int v=a[i];int j=i-1;while(j>=1&&a[j]>v){a[j+1]=a[j];j--;}a[j+1]=v;printf("第%d轮插入排序的结果为",i);for(int k=1;k<=n;k++){printf(" %d",a[k]);}printf("\n");} return 0;
}
2、排序(快速排序算法)
#include<bits/stdc++.h>
using namespace std;
const int N=1e5+5;
int a[N];
int n,m;
void QuickSort(int s,int t){int i=s,j=t;int tmp=a[(i+j)/2];while(i<=j){while(a[j]>tmp)j--;while(a[i]<tmp)i++;if(i<=j){swap(a[i],a[j]);i++,j--;}}if(s<j)QuickSort(s,j);if(i<t)QuickSort(i,t);
}
int main(){cin>>m;while(m--){cin>>n;for(int i=1;i<=n;i++){cin>>a[i];}QuickSort(1,n);for(int i=1;i<=n;i++){cout<<a[i]<<" ";}cout<<endl;}return 0;
}
3、堆排序
#include<bits/stdc++.h>
using namespace std;
const int N=1e3+5;
int a[N];
int n;
void display2(int s){for(int i=0;i<n;i++){if(i==n-1){cout<<a[i]<<endl;}else{cout<<a[i]<<" ";}}
}
void display3(int u,int v){int lar=u;int left=2*u+1;int right=2*u+2;if(left<v&&a[left]>a[lar]){lar=left;}if(right<v&&a[right]>a[lar]){lar=right;}if(lar!=u){swap(a[u],a[lar]);display3(lar,v);}
}
void display1(){for(int i=n/2-1;i>=0;i--){display3(i,n);}
}
int main(){cin>>n;for(int i=0;i<n;i++){cin>>a[i];}//构建初始堆display1();display2(n);for(int i=n-1;i>0;i--){swap(a[0],a[i]);display3(0,i);display2(n);}return 0;
}
4、排列论文
#include<bits/stdc++.h>
using namespace std;
const int N=105;
vector<int>g[N];
int a[N];
int n,m;
int flag;
int topSort(){queue<int>q;for(int i=1;i<=n;i++){if(a[i]==0){q.push(i);}}int cnt=0;flag=1;while(!q.empty()){int t=q.front();q.pop();cnt++;if(!q.empty())flag=2;for(int i=0;i<g[t].size();i++){int x=g[t][i];a[x]--;if(a[x]==0)q.push(x);}}if(cnt<n)flag=0;return flag;
}
int main(){while(cin>>n>>m){for(int i=1;i<=n;i++){g[i].clear();a[i]=0;}for(int i=1;i<=m;i++){int u,v;cin>>u>>v;a[v]++;g[u].push_back(v);}int result=topSort();if(result==0)cout<<"0\n";else if(result==1)cout<<"1\n";else if(result==2)cout<<"2\n";}return 0;
}
四、树(图)的遍历与求解
1、求二叉树的高度
#include<bits/stdc++.h>
using namespace std;
const int N=105;
struct node{int data;int left;int right;
}a[N];
int n;
int dfs(int root){if(root==0)return 0;int h1=dfs(a[root].left);int h2=dfs(a[root].right);return max(h1,h2)+1;
}
int main(){cin>>n;for(int i=1;i<=n;i++){cin>>a[i].data>>a[i].left>>a[i].right;}cout<<dfs(1);return 0;
}
2、二叉树的遍历
#include<bits/stdc++.h>
using namespace std;
const int N=105;
struct node{int left;int right;
}a[N];
int n;
void inorder(int root){if(root==0)return;cout<<root<<" ";inorder(a[root].left);inorder(a[root].right);
}
int main(){cin>>n;for(int i=1;i<=n;i++){cin>>a[i].left>>a[i].right;}inorder(1);return 0;
}
3、完全二叉树的权值
#include<bits/stdc++.h>
using namespace std;
const int N=1e5+5;
int a[N];
int n,x;
int main(){int h=0,nn=0;cin>>n;for(int i=1;i<=n;i++){if(i>nn){nn+=pow(2,h);h++;}cin>>x;a[h]+=x;}int max_a=0,maxh=0;for(int i=1;i<=h;i++){if(a[i]>max_a){max_a=a[i];maxh=i;}}cout<<maxh<<endl;return 0;
}
4、二叉树求值
#include<bits/stdc++.h>
using namespace std;
const int N = 105; // 题目限制n≤100struct Node {int value; // 节点权值int left, right; // 左右子节点编号int count; // 子树节点个数int sum; // 子树权值和
};Node nodes[N];// 递归计算以u为根的子树的节点个数和权值和
void dfs(int u) {if (u == 0) return; // 空节点// 递归处理左右子树dfs(nodes[u].left);dfs(nodes[u].right);// 计算当前子树的节点个数和权值和nodes[u].count = 1; // 自身nodes[u].sum = nodes[u].value;if (nodes[u].left != 0) {nodes[u].count += nodes[nodes[u].left].count;nodes[u].sum += nodes[nodes[u].left].sum;}if (nodes[u].right != 0) {nodes[u].count += nodes[nodes[u].right].count;nodes[u].sum += nodes[nodes[u].right].sum;}
}int main() {int n;cin >> n;// 读取每个节点的信息for (int i = 1; i <= n; i++) {cin >> nodes[i].value >> nodes[i].left >> nodes[i].right;nodes[i].count = 0;nodes[i].sum = 0;}// 从根节点开始递归计算(假设根节点是1)dfs(1);// 输出每个节点的子树信息for (int i = 1; i <= n; i++) {cout << nodes[i].count << " " << nodes[i].sum << endl;}return 0;
}
5、图的遍历----广度优先搜索
#include <bits/stdc++.h>
using namespace std;const int MAXN = 55;
int vis[MAXN];
int a[MAXN][MAXN];
queue<int> q;// 广度优先搜索函数
void bfs(int n) {q.push(0);vis[0] = 1;cout << 0 << " ";while (!q.empty()) {int x = q.front();q.pop();for (int i = 0; i < n; i++) {if (a[x][i] == 1 && vis[i] == 0) {vis[i] = 1;q.push(i);cout << i << " ";}}}
}int main() {int n;cin >> n;for (int i = 0; i < n; i++) {for (int j = 0; j < n; j++) {cin >> a[i][j];}}bfs(n);return 0;
}
6、图的遍历-----深度优先搜索
#include<bits/stdc++.h>
using namespace std;
int vis[55];
int a[55][55];
int n;void dfs(int k){vis[k]=1;cout<<k<<" ";for(int i=0;i<n;i++){if(vis[i]==0&&a[k][i]==1)dfs(i);}
}
int main(){cin>>n;for(int i=0;i<n;i++){for(int j=0;j<n;j++){cin>>a[i][j];}}dfs(0);return 0;
}
7、图着色问题
#include<bits/stdc++.h>
using namespace std;
const int N=510,M=N*N;
int color[N];
vector<int> g[M];
int v,m,k,n;void add(int a,int b){g[a].push_back(b);g[b].push_back(a);
}
int judge(int cnt){if(cnt!=k)return 0;for(int i=1;i<=v;i++){for(int j=0;j<g[i].size();j++){int t=g[i][j];if(color[i]==color[t])return 0;}}return 1;
}
int main(){cin>>v>>m>>k;while(m--){int a,b;cin>>a>>b;add(a,b),add(b,a);}cin>>n;for(int i=0;i<n;i++){set<int> se;//set具有去重功能for(int j=1;j<=v;j++){cin>>color[j];se.insert(color[j]);} if(judge(se.size()))cout<<"Yes"<<endl;else cout<<"No"<<endl;}return 0;
}
8、全排列问题
#include<bits/stdc++.h>
using namespace std;
int a[20],b[20]={0};
int n;
void dfs(int k){if(k==n+1){for(int i=1;i<=n;i++){printf("%d ",a[i]);}printf("\n");return;}for(int i=1;i<=n;i++){if(b[i]==0){a[k]=i;b[i]=1;dfs(k+1);b[i]=0;}}}
int main(){cin>>n;dfs(1);return 0;
}
9、二叉搜索树
#include<bits/stdc++.h>
using namespace std;
struct node{int data;node *left;node *right;
};
int a[10];
int n=10;
//插入树中
bool insert(node *&p,int key){if(p==NULL){p=new node();p->data=key;p->left=NULL;p->right=NULL;return true;}if(key>p->data){return insert(p->right,key);}else{return insert(p->left,key);}
}
//建树
void CreatTree(node *&T,int n){T=NULL;for(int i=1;i<=n;i++){insert(T,a[i]);}
}
//查询
bool search(node *&T,int x){node *q=T;if(q==NULL)return false;if(q->data==x)return true;else if(q->data>x)return search(q->left,x);else return search(q->right,x);
}
//输出
int main(){for(int i=1;i<=n;i++){cin>>a[i];}node *T=NULL;CreatTree(T,n);int x;cin>>x;if(search(T,x)){cout<<"yes"<<endl;}else cout<<"no"<<endl;return 0;
}
10、查找二叉树
#include<bits/stdc++.h>
using namespace std;
const int N=105;
struct node{int value;int left;int right;
}a[N];
int n;
int target;
int cnt=0;
int result=-1;
void zhongxu(int idx){if(idx==0)return;zhongxu(a[idx].left);cnt++;if(a[idx].value==target){result=cnt;}zhongxu(a[idx].right);
}
int main(){cin>>n;cin>>target;for(int i=1;i<=n;i++){cin>>a[i].value>>a[i].left>>a[i].right;}zhongxu(1);cout<<result<<endl;return 0;
}
11、求二叉树的叶子结点
#include<bits/stdc++.h>
using namespace std;
const int N=1e3+5;
char a[N];
int cnt=0;
string str;
void dfs(int r){if(a[2*r]!=-1)dfs(2*r);cout<<a[r];if(a[2*r]==-1&&a[2*r+1]==-1){cnt++;}if(a[2*r+1]!=-1){dfs(2*r+1);}
}
int main(){cin>>str;stack<int>st;st.push(1);for(int i=0;i<str.size();i++){int p=st.top();st.pop();if(str[i]!='#'){a[p]=str[i];st.push(2*p+1);st.push(2*p);}else{a[p]=-1;}}dfs(1);cout<<"\n"<<cnt;return 0;
}
12、二叉树非叶子
#include<bits/stdc++.h>
using namespace std;
const int N=105;
struct node{int value;int left;int right;
}a[N];
int n;
void xianxu(int idx){if(idx==0)return;cout<<a[idx-1].value<<" ";xianxu(a[idx-1].left);xianxu(a[idx-1].right);
}
int main(){cin>>n;for(int i=0;i<n;i++){cin>>a[i].value>>a[i].left>>a[i].right;}for(int i=0;i<n;i++){if(a[i].left!=0&&a[i].right!=0){a[i].value+=1;}}xianxu(1);cout<<endl;return 0;
}
13、走出迷宫
#include <iostream>
#include <queue>
using namespace std;char a[105][105];
int b[105][105];
int n, m;struct Node {int r, c;int step;
};int dir[4][2] = {{-1, 0}, {1, 0}, {0, -1}, {0, 1}};// 检查坐标是否在网格内
bool isValid(int r, int c) {return r >= 1 && r <= n && c >= 1 && c <= m;
}void bfs(int sr, int sc, int er, int ec) {queue<Node> dl;Node q, next;q.r = sr;q.c = sc;q.step = 0;dl.push(q);b[q.r][q.c] = 1;while (!dl.empty()) {q = dl.front();dl.pop();if (q.r == er && q.c == ec) {cout << q.step << endl; // 如果当前点是终点return;}for (int i = 0; i < 4; i++) {next.r = q.r + dir[i][0];next.c = q.c + dir[i][1];// 1可走 2未走过 3不出边界 if (a[next.r][next.c] == '.' && b[next.r][next.c] == 0 && isValid(next.r, next.c)) {next.step = q.step + 1;b[next.r][next.c] = 1;dl.push(next);}}}cout << "No path found!" << endl; // 未找到路径
}int main() {int sr, sc, er, ec;cin >> n >> m;for (int i = 1; i <= n; i++) {for (int j = 1; j <= m; j++) {cin >> a[i][j];if (a[i][j] == 'S') {sr = i;sc = j;}if (a[i][j] == 'T') {er = i;ec = j;a[i][j] = '.'; // 将终点状态记为可走}}}bfs(sr, sc, er, ec);return 0;
}