Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include<stdio.h>
- #include<queue>
- #include<algorithm>
- using namespace std;
- struct pos{
- int I,J;
- pos operator + (const pos& rhs)const
- {
- return {I + rhs.I , J + rhs.J};
- }
- };
- int n,m;
- bool bound(pos a){
- return (0 <= a.I && a.I < n && 0 <= a.J && a.J < m);
- }
- int main()
- {
- scanf("%d %d",&m,&n);
- // if(m > 1000)return -1;
- char arr[n][m+1];
- for(int i = 0 ; i < n ; i ++){
- scanf(" %s",arr[i]);
- }
- /* for(int i = 0 ; i < n ; i ++){
- for(int j = 0 ; j < m ; j ++){
- printf("%c",arr[i][j]);
- }
- printf("\n");
- }
- return 0;
- */ int a = 0,b = 0 ,c = 0;
- for(int i = 0 ; i < n ; i ++){
- for(int j = 0 ; j < m ; j ++){
- if(arr[i][j] == '0')continue;
- queue<pos> q;
- q.push({i,j});
- int mini = 10010;
- int minj = 10010;
- int maxi = -1;
- int maxj = -1;
- int cnt = 0;
- while(!q.empty()){
- pos u = q.front();
- q.pop();
- if(arr[u.I][u.J] == '0')continue;
- arr[u.I][u.J] = '0';
- mini = min(mini,u.I);
- minj = min(minj,u.J);
- maxi = max(maxi,u.I);
- maxj = max(maxj,u.J);
- cnt ++;
- pos move[4] = {{-1,0},{0,1},{1,0},{0,-1}};
- for(int k = 0 ; k < 4 ; k ++){
- pos v = u + move[k];
- if(bound(v) && arr[v.I][v.J] == '1'){
- q.push(v);
- }
- }
- }
- // printf("Test (%d,%d) : %d (%d,%d) , (%d,%d)\n",i,j,cnt,mini,minj,maxi,maxj);
- if(maxi - mini == maxj - minj){
- int len = maxi - mini + 1;
- if(cnt == len*len){
- a++;
- }
- else{
- b++;
- }
- }
- else{
- c++;
- }
- }
- }
- printf("%d %d %d",a,b,c);
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment