Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include<vector>
- #include<algorithm>
- #include<iostream>
- #include<cstdio>
- #include<cstring>
- using namespace std;
- int col[500][500];
- char T[500][500];
- bool log;
- bool vis[500][500];
- int cont=0;
- vector<int>v;
- int clo;
- bool f(int posi,int posj){
- if(T[posi+1][posj]=='X'&&vis[posi+1][posj])return false;
- if(T[posi-1][posj]=='X'&&vis[posi-1][posj])return false;
- if(T[posi][posj+1]=='X'&&vis[posi][posj+1])return false;
- if(T[posi][posj-1]=='X'&&vis[posi][posj-1])return false;
- return true;
- }
- void dfs2(int posi,int posj){
- int cont=0;
- if(vis[posi][posj])return;
- vis[posi][posj]=true;
- if(T[posi+1][posj]=='X')dfs2(posi+1,posj);
- if(T[posi-1][posj]=='X')dfs2(posi-1,posj);
- if(T[posi][posj+1]=='X')dfs2(posi,posj+1);
- if(T[posi][posj-1]=='X')dfs2(posi,posj-1);
- }
- void dfs(int posi,int posj,char l){
- col[posi][posj]=clo;
- if(vis[posi][posj])return;
- vis[posi][posj]=true;
- if(T[posi+1][posj]=='*'||T[posi+1][posj]=='X')dfs(posi+1,posj,T[posi][posj]);
- if(T[posi-1][posj]=='*'||T[posi-1][posj]=='X')dfs(posi-1,posj,T[posi][posj]);
- if(T[posi][posj+1]=='*'||T[posi][posj+1]=='X')dfs(posi,posj+1,T[posi][posj]);
- if(T[posi][posj-1]=='*'||T[posi][posj-1]=='X')dfs(posi,posj-1,T[posi][posj]);
- // if(T[posi+1][posj]=='X'&&!vis[posi+1][posj])if(l=='*'&&f(posi+1,posj))cont++,dfs(posi+1,posj,T[posi][posj]);
- // if(T[posi-1][posj]=='X'&&!vis[posi-1][posj])if(l=='*'&&f(posi-1,posj))cont++,dfs(posi-1,posj,T[posi][posj]);
- // if(T[posi][posj+1]=='X'&&!vis[posi][posj+1])if(l=='*'&&f(posi,posj+1))cont++,dfs(posi,posj+1,T[posi][posj]);
- // if(T[posi][posj-1]=='X'&&!vis[posi][posj-1])if(l=='*'&&f(posi,posj-1))cont++,dfs(posi,posj-1,T[posi][posj]);
- }
- int k=0;
- int main(){
- while(1){
- int a,b;
- k++;
- memset(vis,false,sizeof(vis));
- memset(T,'A',sizeof(T));
- scanf("%d%d",&b,&a);
- v.clear();
- if(a==0&&b==0)break;
- for(int i=1;i<=a;i++){
- for(int j=1;j<=b;j++){
- cin>>T[i][j];
- }
- }
- clo=1;
- for(int i=1;i<=a;i++){
- for(int j=1;j<=b;j++){
- if(vis[i][j])continue;
- if((T[i][j]=='*'||T[i][j]=='X')&&!vis[i][j]){
- // cout<<i<<" "<<j<<endl;
- cont=0;
- dfs(i,j,T[i][j]);
- clo++;
- if(cont!=0)v.push_back(cont);
- }
- }
- }
- memset(vis,false,sizeof(vis));
- for(int i=1;i<=clo;i++){
- cont=0;
- for(int j=1;j<=a;j++){
- for(int r=1;r<=b;r++){
- if((T[j][r]=='X')&&!vis[j][r]&&i==col[j][r]){
- cont++;
- dfs2(j,r);
- }
- }
- }
- if(cont!=0)v.push_back(cont);
- }
- sort(v.begin(),v.end());
- printf("Throw %d\n",k);
- for(int i=0;i<v.size();i++){
- if(i!=v.size()-1)printf("%d ",v[i]);
- else printf("%d\n",v[i]);
- }
- cout<<endl;
- }
- }
Add Comment
Please, Sign In to add comment