P1457 城堡 The Castle
阿新 • • 發佈:2018-11-10
https://www.luogu.org/problemnew/show/P1457
用struct記錄一下城堡的牆面情況(根據輸入的資料來確定)
首先dfs記一下每個聯通塊大小,再列舉每個格子的東牆、北
牆被打通之後連線起來的兩個聯通塊大小,有如下兩種狀況
1、若大於sum則更新sum,方格位置,牆的方位
2、若等於sum,則看一下這個格子在原來格子西面或者下面則更新
格子位置,這個格子跟之前格子是同一個,則更新牆的方位為北
#include<bits/stdc++.h> using namespace std; typedef long long ll; typedef pair<ll ,ll > P; #define INF 0xf3f3f3f const int Max=int(5e5+10); int m,n; struct point { int a[4];// 0xi 1nan 2bei 3dong int value; int key; } mm[55][55]; bool vis[55][55]; int dx[4]= {0,1,-1,0}; int dy[4]= {-1,0,0,1}; int kuai[55*55]; int num,sum,ma; void pan(point &x) { switch(x.value) { case 1: x.a[0]=1,x.a[1]=0,x.a[2]=0,x.a[3]=0; break; case 2: x.a[0]=0,x.a[1]=0,x.a[2]=1,x.a[3]=0; break; case 3: x.a[0]=1,x.a[1]=0,x.a[2]=1,x.a[3]=0; break; case 4: x.a[0]=0,x.a[1]=0,x.a[2]=0,x.a[3]=1; break; case 5: x.a[0]=1,x.a[1]=0,x.a[2]=0,x.a[3]=1; break; case 6: x.a[0]=0,x.a[1]=0,x.a[2]=1,x.a[3]=1; break; case 7: x.a[0]=1,x.a[1]=0,x.a[2]=1,x.a[3]=1; break; case 8: x.a[0]=0,x.a[1]=1,x.a[2]=0,x.a[3]=0; break; case 9: x.a[0]=1,x.a[1]=1,x.a[2]=0,x.a[3]=0; break; case 10: x.a[0]=0,x.a[1]=1,x.a[2]=1,x.a[3]=0; break; case 11: x.a[0]=1,x.a[1]=1,x.a[2]=1,x.a[3]=0; break; case 12: x.a[0]=0,x.a[1]=1,x.a[2]=0,x.a[3]=1; break; case 13: x.a[0]=1,x.a[1]=1,x.a[2]=0,x.a[3]=1; break; case 14: x.a[0]=0,x.a[1]=1,x.a[2]=1,x.a[3]=1; break; case 15: x.a[0]=1,x.a[1]=1,x.a[2]=1,x.a[3]=1; break; } } void dfs(int x,int y,int c) { kuai[c]++; mm[x][y].key=c; for(int i=0; i<4; i++) { int tx=x+dx[i]; int ty=y+dy[i]; if(tx>0&&tx<=n&&ty>0&&ty<=m) if(!vis[tx][ty]&&!mm[x][y].a[i]) { vis[tx][ty]=1; dfs(tx,ty,c); } } } int main() { scanf("%d%d",&m,&n); memset(vis,0,sizeof vis); num=0,sum=0,ma=0; for(int i=1; i<=n; i++) for(int j=1; j<=m; j++) { scanf("%d",&mm[i][j].value); pan(mm[i][j]); } for(int i=1; i<=n; i++) for(int j=1; j<=m; j++) { if(!vis[i][j]) { ++num; vis[i][j]=1; mm[i][j].key=num; dfs(i,j,num); ma=max(ma,kuai[num]); } } printf("%d\n%d\n",num,ma); int x,y; char c; for(int i=n; i>0; i--) for(int j=1; j<=m; j++) { if(mm[i][j].a[2]) { int tx=i+dx[2]; int ty=j+dy[2]; if(tx>0&&tx<=n&&ty>0&&ty<=m) { int x1=mm[tx][ty].key; int x2=mm[i][j].key; if(x1!=x2) { int tt=kuai[x1]+kuai[x2]; if(tt>=sum) { if(tt>sum) { sum=tt; x=i,y=j,c='N'; } else { if((j<y)||(j==y&&i>x)) { sum=tt; x=i,y=j,c='N'; } if(i==x&&j==y) c='N'; } } } } } if(mm[i][j].a[3]) { int tx=i+dx[3]; int ty=j+dy[3]; if(tx>0&&tx<=n&&ty>0&&ty<=m) { int x1=mm[tx][ty].key; int x2=mm[i][j].key; if(x1!=x2) { int tt=kuai[x1]+kuai[x2]; if(tt>=sum) { if(tt>sum) { sum=tt; x=i,y=j,c='E'; } else if((j<y)||(j==y&&i>x)) { sum=tt; x=i,y=j,c='E'; } } } } } } printf("%d\n",sum); printf("%d %d %c\n",x,y,c); return 0; }