1.每行都出现的最小数字
因为每行都严格递增,所以就map统计每个数字出现次数
#include<bits/stdc++.h> using namespace std; int main() { string s; map<int,int>mp; int lines=0; while(getline(cin,s)) { if(s.size()==0)break; s+=','; lines++; int num=0; for(int i=0;i<s.size();i++) { if(isdigit(s[i]))num=num*10+s[i]-'0'; else if(s[i]==',') { mp[num]++; num=0; } } } bool flag=false; for(auto& n:mp) { if(n.second==lines) { flag=true; cout<<n.first<<endl; break; } } if(flag==false)cout<<-1<<endl; }
2.人群数量
dfs递归将连通的1清零,记人群数+1
#include<bits/stdc++.h> using namespace std; void dfs(vector<vector<int>>& v,int i,int j) { if(i>=v.size() || j>=v[0].size() || i<0 || j<0 || v[i][j]==0)return;//边界条件 else v[i][j]=0; dfs(v,i,j+1);//右移 dfs(v,i+1,j);//下移 dfs(v,i,j-1);//左移 dfs(v,i-1,j);//上移 return; } int main() { string s; vector<vector<int>>v; while(getline(cin,s)) { if(s.size()==0)break; int num=0; vector<int>tmp; for(int i=0;i<s.size();i++) { if(isdigit(s[i]))tmp.push_back(s[i]-'0'); } v.push_back(tmp); } int res=0; for(int i=0;i<v.size();i++) { for(int j=0;j<v[0].size();j++) { if(v[i][j]==1){dfs(v,i,j);res++;}//人群数+1 } } cout<<res<<endl; }
全部评论
(5) 回帖