第六章:双指针,BFS,和图论 【完结】
生活随笔
收集整理的這篇文章主要介紹了
第六章:双指针,BFS,和图论 【完结】
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
目錄
- 1238. 日志統計 【雙指針】
- 1101. 獻給阿爾吉儂的花束 【BFS】
- 1113. 紅與黑 【BFS】
- 1224. 交換瓶子 【思維 / 環】
- 1240. 完全二叉樹的權值 【規律】
- 1096. 地牢大師 【BFS】
- 1233. 全球變暖 【BFS】
- 1207. 大臣的旅費 【樹的直徑】
- 826. 單鏈表
1238. 日志統計 【雙指針】
題目詳解
1101. 獻給阿爾吉儂的花束 【BFS】
https://www.acwing.com/problem/content/1103/
y總的寫法:
#include<cstdio> #include<cstring> #include<iostream> #include<algorithm> #include<queue>#define x first #define y secondusing namespace std;typedef pair<int,int>PII;const int N=210;int n,m; char g[N][N]; int dist[N][N];int bfs(PII start,PII end) {queue<PII> q;memset(dist,-1,sizeof dist);dist[start.x][start.y]=0;q.push(start);int dx[4]={-1,0,1,0},dy[4]={0,1,0,-1};while(q.size()){auto t=q.front();q.pop();for(int i=0;i<4;i++){int x=t.x+dx[i],y=t.y+dy[i];if(x<0||x>=n||y<0||y>=m) continue;//過界了if(g[x][y]=='#') continue;//墻if(dist[x][y]!=-1) continue;//走過了dist[x][y]=dist[t.x][t.y]+1;if(end==make_pair(x,y)) return dist[x][y];q.push({x,y});}}return -1; } int main(void) {int T;scanf("%d",&T);while(T--){scanf("%d%d",&n,&m);for(int i=0;i<n;i++) scanf("%s",g[i]);PII start,end;for(int i=0;i<n;i++)for(int j=0;j<m;j++)if(g[i][j]=='S') start={i,j};else if(g[i][j]=='E') end={i,j};int distance=bfs(start,end);if(distance==-1) puts("oop!");else printf("%d\n",distance);}return 0; }1113. 紅與黑 【BFS】
https://www.acwing.com/problem/content/1115/
#include<cstdio> #include<iostream> #include<queue> #include<algorithm> #include<cstring> using namespace std;const int N=210;int m,n; int ans; char map[N][N]; bool vis[N][N]; int dx[4]={-1,0,1,0}; int dy[4]={0,1,0,-1}; struct node {int x,y; }Node; void bfs(int x,int y) {Node.x=x;Node.y=y;ans=1;vis[x][y]=true;queue<node>q;q.push(Node);while(!q.empty()){node top=q.front();q.pop();for(int i=0;i<4;i++){int tempx=top.x+dx[i];int tempy=top.y+dy[i];if(tempx>=1&&tempx<=n&&tempy>=1&&tempy<=m&&map[tempx][tempy]!='#'&&!vis[tempx][tempy]) {node m;m.x=tempx;m.y=tempy;ans++; vis[tempx][tempy]=true;q.push(m);}}} } int main(void) {while(cin>>m>>n,m||n){int startx,starty;for(int i=1;i<=n;i++){for(int j=1;j<=m;j++){cin>>map[i][j]; if(map[i][j]=='@'){startx=i;starty=j;}} }ans=0;bfs(startx,starty);memset(vis,0,sizeof vis);cout<<ans<<endl;}return 0; }DFS寫法:
#include<string> #include<algorithm> #include<iostream> #include<cstring> using namespace std;const int N=25;int n,m; char g[N][N]; bool st[N][N];int dx[4]={-1,0,1,0},dy[4]={0,1,0,-1};int dfs(int x,int y) {int cnt=1;st[x][y]=true;for(int i=0;i<4;i++){int a=x+dx[i],b=y+dy[i];if(a<0||a>=n||b<0||b>=m) continue;if(g[a][b]!='.') continue;if(st[a][b]) continue;cnt+=dfs(a,b);}return cnt; } int main(void) {while(cin>>m>>n,n||m){for(int i=0;i<n;i++) cin>>g[i];int x,y;for(int i=0;i<n;i++)for(int j=0;j<m;j++)if(g[i][j]=='@'){x=i;y=j;}memset(st,0,sizeof st);cout<<dfs(x,y)<<endl;}return 0; } #include<bits/stdc++.h> using namespace std; char mp[30][30]; int vis[30][30]; int dx[4]={-1,0,1,0}; int dy[4]={0,1,0,-1}; int cnt,n,m,startx,starty; void dfs(int x,int y) {vis[x][y]=1;for(int i=0;i<4;i++){int tempx=x+dx[i],tempy=y+dy[i];if(tempx>=0&&tempx<m&&tempy>=0&&tempy<n&&!vis[tempx][tempy]&&mp[tempx][tempy]=='.'){dfs(tempx,tempy);cnt++;}} } int main(void) {while(cin>>n>>m,n||m){cnt=0;memset(vis,0,sizeof vis);for(int i=0;i<m;i++){for(int j=0;j<n;j++){cin>>mp[i][j];if(mp[i][j]=='@') startx=i,starty=j;}}dfs(startx,starty);cout<<cnt+1<<endl;}return 0; }1224. 交換瓶子 【思維 / 環】
題目詳解
1240. 完全二叉樹的權值 【規律】
#include<bits/stdc++.h> using namespace std; typedef long long int LL; const int N=1e5+10; LL a[N],n,ans,h; int main(void) {cin>>n;for(int i=1;i<=n;i++) cin>>a[i];LL j=1;ans=-1e18;for(LL i=1;i<=n;i++){LL temp=0;LL k=j;if(i!=1) k+=pow(2,i-1),k--;for(;j<=min(n,k);j++) temp+=a[j];if(temp>ans) ans=temp,h=i;if(j>n) {cout<<h<<endl;return 0;}}return 0; }1096. 地牢大師 【BFS】
https://www.acwing.com/problem/content/description/1098/
y總代碼:
1233. 全球變暖 【BFS】
https://www.acwing.com/problem/content/1235/
經典的BFS,不過要寫一個check()函數來判斷當前塊是不是挨著海的。同時記錄當前一個連通塊的總的塊數。
總的塊數-挨著海的塊數等于0說明淹沒了。
y總代碼:
#include <cstdio> #include <cstring> #include <iostream> #include <algorithm>#define x first #define y secondusing namespace std;typedef pair<int, int> PII;const int N = 1010;int n; char g[N][N]; bool st[N][N]; PII q[N * N]; int dx[4] = {-1, 0, 1, 0}; int dy[4] = {0, 1, 0, -1};void bfs(int sx, int sy, int &total, int &bound) {int hh = 0, tt = 0;q[0] = {sx, sy};st[sx][sy] = true;while (hh <= tt){PII t = q[hh ++ ];total ++ ;bool is_bound = false;for (int i = 0; i < 4; i ++ ){int x = t.x + dx[i], y = t.y + dy[i];if (x < 0 || x >= n || y < 0 || y >= n) continue; // 出界if (st[x][y]) continue;if (g[x][y] == '.'){is_bound = true;continue;}q[ ++ tt] = {x, y};st[x][y] = true;}if (is_bound) bound ++ ;} }int main() {scanf("%d", &n);for (int i = 0; i < n; i ++ ) scanf("%s", g[i]);int cnt = 0;for (int i = 0; i < n; i ++ )for (int j = 0; j < n; j ++ )if (!st[i][j] && g[i][j] == '#'){int total = 0, bound = 0;bfs(i, j, total, bound);if (total == bound) cnt ++ ;}printf("%d\n", cnt);return 0; } #include<bits/stdc++.h> using namespace std; const int N=1010; char mp[N][N]; int vis[N][N],n,sum,ans; int dx[4]={-1,0,1,0}; int dy[4]={0,1,0,-1}; bool check(int x,int y) {for(int i=0;i<4;i++){int tempx=x+dx[i];int tempy=y+dy[i];if(tempx>=0&&tempx<n&&tempy>=0&&tempy<n&&mp[tempx][tempy]!='#') return false;}return true; } void dfs(int x,int y) {vis[x][y]=1;if(check(x,y)) ans++;for(int i=0;i<4;i++){int tempx=x+dx[i];int tempy=y+dy[i];if(tempx>=0&&tempx<n&&tempy>=0&&tempy<n&&!vis[tempx][tempy]&&mp[tempx][tempy]=='#')dfs(tempx,tempy);}return; } int main(void) {cin>>n;for(int i=0;i<n;i++)for(int j=0;j<n;j++)cin>>mp[i][j];for(int i=0;i<n;i++){for(int j=0;j<n;j++){ans=0;if(vis[i][j]) continue;if(mp[i][j]=='#'){dfs(i,j);if(ans==0) sum++;}}}cout<<sum;return 0; }1207. 大臣的旅費 【樹的直徑】
#include<bits/stdc++.h> using namespace std; const int N=1e5+10; struct edge {int id,w; }; vector<edge> h[N]; int n,dist[N]; void dfs(int u,int father,int d) {dist[u]=d;for(int i=0;i<h[u].size();i++){if(h[u][i].id!=father) dfs(h[u][i].id,u,d+h[u][i].w);} } int main(void) {cin>>n;for(int i=0;i<n-1;i++){int a,b,c; cin>>a>>b>>c;h[a].push_back({b,c});h[b].push_back({a,c});}dfs(1,-1,0);int u=1;for(int i=1;i<=n;i++) if(dist[i]>dist[u]) u=i;dfs(u,-1,0);for(int i=1;i<=n;i++) if(dist[i]>dist[u]) u=i;int s=dist[u];printf("%lld\n",s*10+(s+1ll)*s/2);return 0; }826. 單鏈表
#include<bits/stdc++.h> using namespace std; const int N=1e5+10; int e[N],ne[N],idx,head,n; void init() {head=-1;idx=0; } void head_add(int a) {e[idx]=a,ne[idx]=head,head=idx++; } void add(int a,int b) {e[idx]=b,ne[idx]=ne[a],ne[a]=idx++; } void remove(int x) {ne[x]=ne[ne[x]]; } int main(void) {init();cin>>n;while(n--){string op; cin>>op;if(op=="H"){int x; cin>>x; head_add(x);}if(op=="D"){int x; cin>>x;if(x)remove(x-1);else head=ne[head];}if(op=="I"){int a,b; cin>>a>>b;add(a-1,b);}}for(int i=head;i!=-1;i=ne[i]) cout<<e[i]<<" ";return 0; }總結
以上是生活随笔為你收集整理的第六章:双指针,BFS,和图论 【完结】的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 第三届传智杯全国大学生IT技能大赛(决赛
- 下一篇: “九韶杯”河科院程序设计协会第一届程序设