Advertisement
Guest User

Untitled

a guest
Apr 16th, 2014
52
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.54 KB | None | 0 0
  1. /*
  2. ID: dibyapo2
  3. TASK: castle
  4. LANG: C++
  5. */
  6.  
  7. #include <iostream>
  8. #include <cstdio>
  9. #include <cstring>
  10. #include <string>
  11. #include <vector>
  12. #include <algorithm>
  13. #define MAXX 51
  14.  
  15. using namespace std;
  16.  
  17.  
  18. struct data{
  19.     bool walls[4]; //0-west,1-north,2-east,3-south
  20. };
  21.  
  22. int M,N,max_brk,brk_r,brk_c,brk_dir;
  23. int direc[4][2]={{0,-1},{-1,0},{0,1},{1,0}};
  24. string directions="WNES";
  25.  
  26. data grid[MAXX][MAXX];
  27. int r_grid[MAXX][MAXX];
  28. bool visited[MAXX][MAXX];
  29. int room_no[MAXX*MAXX];
  30.  
  31. void generate(int r,int c,int num){
  32.     int i,cnt=0;
  33.     string digits="";
  34.     for(i=num;i!=0;i/=2){
  35.         digits+='0'+(i%2);
  36.     }
  37.     memset(grid[r][c].walls,0,sizeof(grid[r][c].walls));
  38.     for(i=0;i<digits.length();i++){
  39.         grid[r][c].walls[i]=(bool)(digits[i]-'0');
  40.     }
  41.     /*printf(" ");
  42.     cout << digits << " ";
  43.     for(i=0;i<4;i++) printf("%d",grid[r][c].walls[i] );
  44.     printf(" ");*/
  45.  
  46.     return;
  47.  
  48. }
  49.  
  50. int dfs(int r,int c,int room){
  51.     int cnt=1;
  52.     visited[r][c]=1;
  53.     r_grid[r][c]=room;
  54.  
  55.     if(grid[r][c].walls[0]==0&&c-1>=0&&!visited[r][c-1]) cnt+=dfs(r,c-1,room);
  56.     if(grid[r][c].walls[1]==0&&r-1>=0&&!visited[r-1][c]) cnt+=dfs(r-1,c,room);
  57.     if(grid[r][c].walls[2]==0&&c+1<M&&!visited[r][c+1]) cnt+=dfs(r,c+1,room);
  58.     if(grid[r][c].walls[3]==0&&r+1<N&&!visited[r+1][c]) cnt+=dfs(r+1,c,room);
  59.  
  60.     return cnt;
  61.  
  62. }
  63.  
  64. int breakwall(int r,int c,int dir){
  65.     if(r+direc[dir][0]>=0&&r+direc[dir][0]<N&&c+direc[dir][1]>=0&&c+direc[dir][1]<M){
  66.         if(r_grid[r][c]!=r_grid[r+direc[dir][0]][c+direc[dir][1]]) return room_no[r_grid[r][c]]+room_no[r_grid[r+direc[dir][0]][c+direc[dir][1]]];
  67.     }
  68.     return 0;
  69. }
  70.  
  71. int main(){
  72.  
  73.     int i,j,cnt,maxrooms=0,room=0;
  74.  
  75.     freopen("castle.in","r",stdin);
  76.     freopen("castle.out","w",stdout);
  77.  
  78.     scanf("%d %d",&M,&N);
  79.  
  80.     for(i=0;i<N;i++){
  81.         //printf("Reached! i=%d ",i);
  82.         for(j=0;j<M;j++){
  83.             int temp;
  84.             scanf("%d",&temp);
  85.             generate(i,j,temp);
  86.         }
  87.     }
  88.     memset(visited,0,sizeof visited);
  89.     //printf("Here ! ");
  90.  
  91.     for(i=0;i<N;i++){
  92.         for(j=0;j<M;j++){
  93.             if(!visited[i][j]) {room=room+1;cnt=dfs(i,j,room);
  94.             room_no[room]=cnt;
  95.             if(maxrooms<cnt) maxrooms=cnt;
  96.             }
  97.         }
  98.     }
  99.    
  100.     for(i=0;i<M;i++){
  101.         for(j=N-1;j>=0;j--){
  102.             for(int k=0;k<4;k++){
  103.                 int temp_brk;
  104.                 if(grid[j][i].walls[k]==1) temp_brk=breakwall(j,i,k);
  105.                 if(temp_brk>max_brk){
  106.                     max_brk=temp_brk;
  107.                     brk_r=j;
  108.                     brk_c=i;
  109.                     brk_dir=k;
  110.                 }
  111.             }
  112.         }
  113.     }
  114.     printf("%d\n",room);
  115.     printf("%d\n",maxrooms);
  116.     printf("%d\n",max_brk);
  117.     printf("%d %d %c\n",brk_r+1,brk_c+1,directions[brk_dir]);
  118.     //for(i=1;i<=room;i++) printf("%d ",room_no[i]);
  119.  
  120.     return 0;
  121. }
  122.  
  123. /** AC!!! **/
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement