5 solutions
-
2
#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
#include<bits/stdc++.h> using namespace std; int n, m; char a[105][105]; int sum = 0; void dfs(int x,int y) { int x1[4]={1, 0, -1, 0}; int y1[4]={0, 1, 0, -1}; if(x<1||x>n||y<1||y>m||a[x][y]=='0')//越界或不是细胞(与其他细胞相连) { return;//剪枝 } a[x][y]='0';//将与第一个细胞相连的删掉(包括第一个细胞) for(int i = 0; i < 4; i++) { dfs(x+x1[i], y+y1[i]); } } int main() { cin >> n >> m; for(int i = 1; i <= n; i++) { for(int j = 1; j <= m; j++) { cin >> a[i][j]; } } for(int i = 1; i <= n; i++) { for(int j = 1; j <= m; j++) { if(a[i][j]!='0') { sum++; dfs(i,j); } } } cout << sum; return 0; }
-
1
#include <iostream> #include <cmath> using namespace std; int n,m,cnt=0; int dx[4]={-1,1,0,0}; int dy[4]={0,0,1,-1}; char mp[105][105]; void dfs(int x,int y){ mp[x][y]='0'; for(int i=0;i<=3;i++){ int nx=x+dx[i],ny=y+dy[i]; if(nx>=1&&nx<=n&&ny>=1&&ny<=m &&mp[nx][ny]>='1'&&mp[nx][ny]<='9') dfs(nx,ny); } } int main(){ cin>>n>>m; 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]>='1'&&mp[i][j]<='9'){ cnt++; dfs(i,j); } } } cout<<cnt<<endl; return 0; }
-
0
题意
输入一个由数字 0-9 组成的 的细胞矩阵,找有多少个细胞
细胞定义:一个 1-9 的数字为一个细胞,细胞的四面如果有细胞,那么算它们为一个细胞
PS:输入的第 行每个数之间没有空格
思路
几个简单遍历就能搞定~
只要发现一个新细胞(没被发现过),就遍历并把答案加 1
代码
#include <bits/stdc++.h> using namespace std; string s; int a[105][105],cnt,n,m; bool f[105][105]; void dfs(int i,int j){ // printf("%d %d\n",i,j); f[i][j] = 1; // 标记遍历过了 if (a[i - 1][j] && !f[i - 1][j]) dfs(i - 1,j); // 上面是细胞且没被遍历,就遍历上面 if (a[i][j - 1] && !f[i][j - 1]) dfs(i,j - 1); // 左边同理 if (a[i + 1][j] && !f[i + 1][j]) dfs(i + 1,j); // 下面同理 if (a[i][j + 1] && !f[i][j + 1]) dfs(i,j + 1); // 右边同理 } int main(int argc, char **argv){ cin >> n >> m; for (int i = 1;i <= n;i++){ // 输入字符串并转换 cin >> s; for (int j = 1;s[j - 1];j++){ a[i][j] = s[j - 1] - '0'; } } for (int i = 1;i <= n;i++){ for (int j = 1;j <= m;j++){ if (a[i][j] && !f[i][j]){ // 如果是细胞且没被遍历,就把细胞数加 1 并遍历 cnt++; dfs(i,j); } } } cout << cnt; return 0; }
-
-2
#include<cstdio> using namespace std; bool a[200][200]; void kill(int,int); int main(){ int n,m; scanf("%d %d",&n,&m); for(int i=1;i<=n;i++) for(int j=1;j<=m;j++) scanf("%1d",&a[i][j]); int sum=0; for(int i=1;i<=n;i++) for(int j=1;j<=m;j++) if(a[i][j]){ sum++; kill(i,j); } printf("%d",sum); } void kill(int n,int m){ a[n][m]=0; if(a[n+1][m]) kill(n+1,m); if(a[n-1][m]) kill(n-1,m); if(a[n][m+1]) kill(n,m+1); if(a[n][m-1]) kill(n,m-1); }
- 1
Information
- ID
- 972
- Time
- 1000ms
- Memory
- 125MiB
- Difficulty
- 5
- Tags
- # Submissions
- 55
- Accepted
- 22
- Uploaded By