fork(1) download
  1. #include <cstdio>
  2. #include <cstdlib>
  3. #include <cstring>
  4.  
  5. struct data{
  6. int m;
  7. int l;
  8. };
  9.  
  10. int comp_data(const void *l,const void *r){
  11. int lm = (*(data *)l).m;
  12. int rm = (*(data *)r).m;
  13. int ll = (*(data *)l).l;
  14. int rl = (*(data *)r).l;
  15.  
  16. return ((rm - lm == 0)?rl - ll:rm - lm);
  17. }
  18.  
  19. char map[100][101];
  20. bool flg[100][100];
  21. int H,W;
  22.  
  23. int search(data *,int,int);
  24.  
  25. int main(void){
  26.  
  27. scanf("%d %d\n",&H,&W);
  28.  
  29. int list_cnt = 0;
  30. data *list = (data *)malloc(sizeof(data) * (int)(H * W / 2));
  31. if(list == NULL) return -1;
  32. memset(list,0,sizeof(data) * (int)(H * W / 2));
  33.  
  34. for(int i = 0;i < H;i++) scanf("%s\n",map[i]);
  35.  
  36. for(int i = 0;i < H;i++){
  37. for(int j = 0;j < W;j++){
  38. if(map[i][j] == '#' && !flg[i][j]){
  39. search(&list[list_cnt++],j,i);
  40. }
  41. }
  42. }
  43. qsort(list,list_cnt,sizeof(data),comp_data);
  44. for(int i = 0;i < list_cnt;i++){
  45. printf("%d %d\n",list[i].m,list[i].l);
  46. }
  47. return 0;
  48. }
  49.  
  50. int search(data *counter,int x,int y){
  51. if(x < 0 || x >= W || y < 0 || y >= H){
  52. (*counter).l++;
  53. return 1;
  54. }
  55. if(map[y][x] == '.'){
  56. (*counter).l++;
  57. return 2;
  58. }
  59.  
  60. if(flg[y][x]) return -1;
  61. else{
  62. flg[y][x] = true;
  63. counter->m++;
  64.  
  65. search(counter,x + 1,y);
  66. search(counter,x - 1,y);
  67. search(counter,x,y + 1);
  68. search(counter,x,y - 1);
  69. }
  70. return 0;
  71. }
Success #stdin #stdout 0s 15240KB
stdin
3 5
##..#
##..#
...##
stdout
4 10
4 8