6 条题解
-
1涂星哲 (xingcode) LV 6 @ 2023-4-2 11:02:26
#include<bits/stdc++.h>//万能头 using namespace std; char mp[165][165];//水塘 int n,m,s,v[165][165]; int d[8][2]={1,0,0,1,-1,0,0,-1,1,-1,-1,1,-1,-1,1,1}; //8方向 void p(int x,int y) { int i,dx,dy; v[x][y]=1;//已遍历过 for(i=0;i<=7;i++) { dx=x+d[i][0];//往8个方向 dy=y+d[i][1];//继续扩展 if(mp[dx][dy]=='W'&&v[dx][dy]==0)//若未遍览过 且 为水坑则继续 { p(dx,dy);//继续搜索 } } } int main() { cin>>n>>m;//输入n,m s=0;//水坑数 for(int i=1;i<=n;i++) { for(int j=1;j<=m;j++) { cin>>mp[i][j];//输入 } } for(int i=1;i<=n;i++)// { for(int j=1;j<=m;j++) { if(mp[i][j]=='W'&&v[i][j]==0)//若未遍览过 且 为水坑则继续 { p(i,j);//搜索 s++;//搜索完毕,水塘总数+1 } } } cout<<s;//输出s return 0; //结束 }
-
12022-10-15 16:38:02@
#include <iostream> using namespace std; int dx[8] = {-1, -1, -1, 0, 0, 1, 1, 1}; int dy[8] = {-1, 0, 1, -1, 1, -1, 0, 1}; int n, m; char a[105][105]; void dfs(int x, int y,int cnt) { // 染色标记 a[x][y] = '.'; for (int i = 0; i < 8; i++) { int nx = x + dx[i]; int ny = y + dy[i]; if (nx <= n and nx >= 1 and 1 <= ny and ny <= m and a[nx][ny] == 'W'){ dfs(nx,ny,cnt+1); } } } int main() { cin >> n >> m; for (int i = 1; i <= n; i++) { for (int j = 1; j <= m; j++) { cin >> a[i][j]; } } int ans = 0; for (int i = 1; i <= n; i++) { for (int j = 1; j <= m; j++) { // 寻找连通块,记录个数 if (a[i][j] == 'W') { dfs(i,j,1); ans++; } } } cout << ans << endl; return 0; }
-
02024-10-13 9:34:11@
#include<bits/stdc++.h> #define int long long using namespace std; int n,m,ans; int dir[8][2]={{-1,0},{1,0},{0,-1},{0,1},{-1,-1},{-1,1},{1,-1},{1,1}}; char w[115][115]; struct point{ int px,py; }; queue<point> que; void bfs(int tx,int ty){ w[tx][ty]='.'; que.push((point){tx,ty}); while(!que.empty()){ point p=que.front(); que.pop(); for(int i=0;i<8;i++){ int nx=p.px+dir[i][0]; int ny=p.py+dir[i][1]; if(nx>=1&&nx<=n&&ny>=1&&ny<=m&&w[nx][ny]=='W'){ w[nx][ny]='.'; que.push((point){nx,ny}); } } } } signed main(){ cin>>n>>m; for(int i=1;i<=n;i++){ for(int j=1;j<=m;j++){ cin>>w[i][j]; } } for(int i=1;i<=n;i++){ for(int j=1;j<=m;j++){ if(w[i][j]=='W'){ bfs(i,j); ans++; } } } cout<<ans; }
-
02024-3-25 20:14:13@
这是一道
大大滴难题经典DFS连通块问题
直接用那个模板套进去就可以得分了
不抄代码,人人有责好吧好吧,为了满足某些蒟蒻的需求,奉送代码一篇
#include<bits/stdc++.h> using namespace std; int n,m,Lakemap[500][500]; void dfs(int x,int y){ if(Lakemap[x][y]==0)return; if(x<=0 || x>n || y<=0 || y>m ){ return ; } Lakemap[x][y]=0; dfs(x-1,y); dfs(x-1,y+1); dfs(x-1,y-1); dfs(x,y-1); dfs(x,y+1); dfs(x+1,y+1); dfs(x+1,y-1); dfs(x+1,y); } int main(){ cin>>n>>m; for(int i=1;i<=n;i++){ for(int j=1;j<=m;j++){ char ch; cin>>ch; if(ch=='W')Lakemap[i][j]=1; else Lakemap[i][j]=0; } } int ans=0; for(int i=1;i<=n;i++){ for(int j=1;j<=m;j++){ if(Lakemap[i][j]==1){ dfs(i,j); ans+=1; } } } cout<<ans; }
-
02023-12-17 16:51:32@
col1 col2 col3 #include<bits/stdc++.h> using namespace std; int xx[9]={0,-1,-1,-1,0,0,1,1,1};//x方向 int xy[9]={0,-1,0,1,-1,1,-1,0,1};//y方向 int n,m,ans; char a[105][105]; void dfs(int x,int y) { int r,c; a[x][y]='.'; for (int i=1;i<=8;i++) { r=x+xx[i]; c=y+xy[i]; if (r<1 r>n continue; a[r][c]='.'; dfs(r,c); } int main() { scanf("%d %d\n",&n,&m); for (int i=1;i<=n;i++) { for (int j=1;j<=m;j++) cin>>a[i][j]; } ans=0; for (int i=1;i<=n;i++) { for (int j=1;j<=m;j++) { if (a[i][j]=='W') { ans++; dfs(i,j); } printf("%d\n",ans); return 0; } - [ ]
-
02022-8-5 11:40:05@
#include <bits/stdc++.h> using namespace std; char a[108][108]; bool a1[108][108]; int n,m,sum=0; void DFS(int i,int j) { if(a1[i][j]true) { a1[i][j]=false; DFS(i+1,j+1); DFS(i-1,j-1); DFS(i-1,j+1); DFS(i+1,j-1); DFS(i,j+1);
DFS(i,j-1); DFS(i-1,j); DFS(i+1,j); } else return; } int main() { cin>>n>>m; memset(a1,false,sizeof(a1)); for(int i=1; i<=n; i++) { for(int j=1; j<=m; j++) { cin>>a[i][j]; if(a[i][j]'W') a1[i][j]=true; } } for(int i=1; i<=n; i++) { for(int j=1; j<=m; j++) { if(a1[i][j]==true) { DFS(i,j); sum++; } } } cout<<sum<<endl;return 0;
}
- 1
信息
- ID
- 2617
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 4
- 标签
- 递交数
- 52
- 已通过
- 25
- 上传者