虽然很多人说用广搜,但我使用深搜做的。因为是第二次写深搜,写的很烂也很麻烦,还写了很久,而且途中不免磕磕绊绊,虽然过了,但代码有待优化。本题依旧用了位运算,位运算好东西啊。下面贴出代码,以作纪念。

View Code
  1 /*{
  2 ID:jzy3209981
  3 PROG:castle
  4 LANG:C++
  5 }*/
  6 #include<stdio.h>
  7 #include<iostream>
  8 #include<string.h>
  9 #include<stdlib.h>
 10 #include<math.h>
 11 using namespace std;
 12 
 13 int No[50][50];
 14 int sign[50][50];
 15 int quality;
 16 int cpy[50][50];
 17 int number=0;
 18 int search(int **house,int i,int j)
 19 {
 20     int p,po,judge;
 21     po=house[i][j];
 22     judge=(1<<4)-1;
 23     po=judge&(~po);        
 24     sign[i][j]=1;
 25     No[i][j]=number;
 26     while(po!=0)
 27     {    
 28         p=po&-po;
 29         po-=p;
 30         if(p==1&&sign[i][j-1]!=1)
 31         {
 32             quality++;
 33             search(house,i,j-1);
 34             No[i][j-1]=number;
 35         }
 36         else if(p==2&&sign[i-1][j]!=1)
 37         {
 38             quality++;
 39             search(house,i-1,j);
 40             No[i-1][j]=number;
 41         }
 42         else if(p==4&&sign[i][j+1]!=1)
 43         {
 44             quality++;
 45             search(house,i,j+1);
 46             No[i][j+1]=number;
 47         }
 48         else if(p==8&&sign[i+1][j]!=1)
 49         {
 50             quality++;
 51             search(house,i+1,j);
 52             No[i+1][j]=number;
 53         }
 54     }
 55     return quality;
 56 }
 57 void dfs(int **house,int m,int n)
 58 {
 59     int max=0,i,j;
 60     for(i=0;i<m;i++)
 61         for(j=0;j<n;j++)
 62         {    
 63             if(sign[i][j]!=1)
 64             {
 65                 quality=1;
 66                 number++;            
 67                 quality=search(house,i,j);
 68                 if(quality>max)
 69                     max=quality;            
 70             }
 71         }            
 72         printf("%d\n",number);
 73         printf("%d\n",max);
 74 }
 75 
 76 int main()
 77 {
 78         freopen ("castle.in","r",stdin);
 79         freopen ("castle.out","w",stdout);
 80     int m,n,i,j,max=0,a,b,now;
 81     char ch;
 82     int **house;
 83     scanf("%d%d",&n,&m);
 84     house=new int*[m];
 85     for(i=0;i<m;i++)
 86         house[i]=new int[n];
 87     for(i=0;i<m;i++)
 88         for(j=0;j<n;j++)
 89             scanf("%d",&house[i][j]);
 90         dfs(house,m,n);        
 91         memcpy(cpy,No,sizeof(No));
 92         for(j=0;j<n;j++)
 93         {            
 94             for(i=m-1;i>=0;i--)
 95             {
 96                 memset(sign,0,sizeof(sign));
 97                 if(i-1>=0&&cpy[i][j]!=cpy[i-1][j])
 98                 {
 99                     quality=1;
100                     now=search(house,i-1,j);
101                     quality=1;
102                     now+=search(house,i,j);
103                     if(now>max)
104                     {
105                         max=now;
106                         a=i;
107                         b=j;
108                         ch='N';
109                     }
110                 }
111             }
112             for(i=m-1;i>=0;i--)
113             {
114                 memset(sign,0,sizeof(sign));
115                 if(j+1<n&&cpy[i][j]!=cpy[i][j+1])
116                 {
117                     quality=1;
118                     now=search(house,i,j+1);
119                     quality=1;
120                     now+=search(house,i,j);
121                     if(now>max)
122                     {
123                         max=now;
124                         a=i;
125                         b=j;
126                         ch='E';
127                     }                            
128                 }            
129             }
130             
131         }
132         printf("%d\n",max);
133         printf("%d %d %c\n",a+1,b+1,ch);
134         return 0;
135 }
136  

 

posted on 2012-07-19 22:59  醉春雨  阅读(110)  评论(0)    收藏  举报