DFS学不会系列

高手去散步
#include <bits/stdc++.h> using namespace std; typedef long long ll; const int N=55; int g[N][N]; int dist[N]; bool st[N]; int n,m,ma; void dfs(int u,int sum) { ma=max(ma,sum); for (int i=1; i<=n; i++) { if (!st[i]&&g[u][i]) { st[i]=true; dfs(i,sum+g[u][i]); st[i]=0; } } } signed main() { cin>>n>>m; for (int i=0; i<m; i++) { int a,b,c; cin>>a>>b>>c; g[a][b]=g[b][a]=max(g[a][b],c); } for (int i=1; i<=n; i++) { memset(st,0,sizeof st); st[i]=1; dfs(i,0); } cout<<ma<<"\n"; return 0; }
1123取数问题
#include <bits/stdc++.h> using namespace std; typedef long long ll; const int N=30; int g[N][N]; int st[N][N]; int n,m,ma; int dx[8]= {-1,-1,0,1,1,1,0,-1},dy[8]= {0,1,1,1,0,-1,-1,-1}; void dfs(int x,int y,int sum) { if (y==m+1) { y=1; x++; } if (x==n+1) { ma=max(ma,sum); return; } dfs(x,y+1,sum); if (!st[x][y]) { st[x][y]++; for (int i=0; i<8; i++) { int a=x+dx[i],b=y+dy[i]; st[a][b]++; } dfs(x,y+1,sum+g[x][y]); st[x][y]--; for (int i=0; i<8; i++) { int a=x+dx[i],b=y+dy[i]; st[a][b]--; } } } signed main() { int t; cin>>t; while (t--) { cin>>n>>m; ma=0; memset(st,0,sizeof st); for (int i=1; i<=n; i++) for (int j=1; j<=m; j++) cin>>g[i][j]; dfs(1,1,0); cout<<ma<<"\n"; } return 0; }
小埋与扫雷
#include <bits/stdc++.h> using namespace std; typedef long long ll; const int N=1010; int g[N][N];//雷是1,空格是2,数字是3 bool st[N][N]; int n,m,ans; int dx[8]= {-1,-1,0,1,1,1,0,-1},dy[8]= {0,1,1,1,0,-1,-1,-1}; void judge(int x,int y) { bool have_lei=false; for (int i=0; i<8; i++) { int a=x+dx[i],b=y+dy[i]; if (a>=1&&a<=n&&b>=1&&b<=m) { if (g[a][b]==1) { have_lei=true; break; } } } if (have_lei)g[x][y]=3; else g[x][y]=2; return; } void dfs(int x,int y) { st[x][y]=true; for (int i=0; i<8; i++) { int a=x+dx[i],b=y+dy[i]; if (a>=1&&a<=n&&b>=1&&b<=m) { if (g[a][b]==2&&!st[a][b]) dfs(a,b); } } return; } bool check(int x,int y) { bool no_kg=true; for (int i=0;i<8;i++) { int a=x+dx[i],b=y+dy[i]; if (a>=1&&a<=n&&b>=1&&b<=m) { if (g[a][b]==2) { no_kg=false; break; } } } return no_kg; } signed main() { cin>>n>>m; for (int i=1; i<=n; i++) for (int j=1; j<=m; j++) cin>>g[i][j]; for (int i=1; i<=n; i++) for (int j=1; j<=m; j++) if (!g[i][j]) judge(i,j); for (int i=1; i<=n; i++) for (int j=1; j<=m; j++) if (g[i][j]==2&&!st[i][j]) dfs(i,j),ans++; for (int i=1;i<=n;i++) for (int j=1;j<=m;j++) if (g[i][j]==3) if (check(i,j)) ans++; cout<<ans<<"\n"; return 0; }

浙公网安备 33010602011771号