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

浙公网安备 33010602011771号