5 solutions
-
2
这不是在图里面的题吗
#include<bits/stdc++.h> using namespace std; string arr[110]; int n,m,ans=0; int xx[5]={1,0,-1,0},yy[5]={0,1,0,-1}; void dfs(int x,int y){ arr[x][y]='0'; for(int i=0;i<4;i++){ if(x+xx[i]>=0 && x+xx[i]<n && y+yy[i]>=0 && y+yy[i]<m && arr[x+xx[i]][y+yy[i]]!='0') dfs(x+xx[i],y+yy[i]); } } int main(){ cin>>n>>m; for(int i=0;i<n;i++) cin>>arr[i]; for(int i=0;i<n;i++){ for(int j=0;j<m;j++){ if(arr[i][j]!='0'){ ans++; dfs(i,j); } } } cout<<ans; return 0; }
-
1
超短代码
#include<bits/stdc++.h> using namespace std; string pp[105]; int n,m,sum=0,xx[5]={1,0,-1,0},yy[5]={0,1,0,-1}; void dfs(int x,int y){ pp[x][y]='0'; for(int i=0;i<4;i++)if(x+xx[i]>=0&&x+xx[i]<n&&y+yy[i]>=0&&y+yy[i]<m&&pp[x+xx[i]][y+yy[i]]!='0')dfs(x+xx[i],y+yy[i]); } int main(){ cin>>n>>m; for(int i=0;i<n;i++)cin>>pp[i]; for(int i=0;i<n;i++)for(int j=0;j<m;j++)if(pp[i][j]!='0'){ sum++; dfs(i,j); }cout<<sum; }
-
0
#include<bits/stdc++.h> using namespace std; char c[1001][1001]; struct node{ int wx,wy; }; const int dx[4]={0,0,-1,1}; const int dy[4]={1,-1,0,0}; int n,m; void bfs(int x,int y){ c[x][y]='0'; queue<pair<int,int> > q; q.push({x,y}); while(!q.empty()){ int sx=q.front().first; int sy=q.front().second; q.pop(); for(int i=0;i<4;i++){ int nx=sx+dx[i]; int ny=sy+dy[i]; if(nx<1||ny<1||nx>n||ny>m||c[nx][ny]=='0')continue; c[nx][ny]='0'; q.push({nx,ny}); } } } int main(){ //小小BFS,不轻松拿下 cin>>n>>m; for(int i=1;i<=n;i++){ for(int j=1;j<=m;j++){ cin>>c[i][j]; } } int cnt=0; for(int i=1;i<=n;i++){ for(int j=1;j<=m;j++){ if(c[i][j]!='0'){ bfs(i,j); cnt++; } } } cout<<cnt; return 0; }
-
0
#include<bits/stdc++.h> using namespace std; int a1,a2; char a[105][105]; int sum=0; void dfs(int x,int y){ if(x<1||x>a1||y<1||y>a2||a[x][y]=='0') return; a[x][y]='0'; dfs(x+1,y); dfs(x,y+1); dfs(x-1,y); dfs(x,y-1); } int main(){ cin>>a1>>a2; for(int i=1;i<=a1;i++) for(int j=1;j<=a2;j++) cin>>a[i][j]; for(int i=1;i<=a1;i++) for(int j=1;j<=a2;j++) if(a[i][j]!='0'){ sum++; dfs(i,j); } cout<<sum<<"\n"; return 0; }
AC代码奉上
-
0
注意:题目的输入没有空格 👀️ !!!
#include<iostream> #include<string> using namespace std; //用一个数组来存储相对位置 int x[4]={-1,1,0,0}; int y[4]={0,0,-1,1}; int a[1000][1000],us[1000][1000],n,m,ans=0;//初始化 void dfs(int q,int w)//用于标记细胞是否探索过 { us[q][w]=1;//去过就打标记 for(int i=0;i<4;i++) { //超长的判断(包括是否越位) if(q+x[i]>=0 && q+x[i]<n && w+y[i]>=0 && w+y[i]<m && us[q+x[i]][w+y[i]]==0 && a[q+x[i]][w+y[i]]!=0) { dfs(q+x[i],w+y[i]);//只有满足条件才能继续搜索,标记 } } } int main() { string s; cin>>n>>m;//输入 for(int i=0;i<n;i++) { cin>>s;//可恶的字符串 for(int j=0;j<m;j++) { us[i][j]=0;//初始化 a[i][j]=s[j]-48;//可恶的字符串 } } for(int i=0;i<n;i++) { for(int j=0;j<m;j++) { if(us[i][j]==0 && a[i][j]!=0)//当是一个细胞时且没标记过 { ans++;//增加 dfs(i,j);//标记整个细胞 } } } cout<<ans;//输出 return 0;//完结散花 }
- 1
Information
- ID
- 814
- Time
- 1000ms
- Memory
- 256MiB
- Difficulty
- 6
- Tags
- # Submissions
- 154
- Accepted
- 49
- Uploaded By