1 條題解
-
0
C++ :
#include<bits/stdc++.h> using namespace std; const int N=55; int st[N][N]; int g[N][N]; int dx[]={0,-1,0,1}; //左上右下 int dy[]={-1,0,1,0}; int color[N*N]; char chs[]={'W','N','E','S'}; //西北东南 typedef pair<int,int> PII; #define x first #define y second int n,m; int bfs(int x,int y,int c) { queue<PII> q; q.push({x,y}); st[x][y]=c; int tot=1; //联通块大小 while(q.size()) { PII t=q.front(); q.pop(); for(int i=0;i<4;i++) { if(!(g[t.x][t.y]>>i&1)) //没有墙 { int a=t.x+dx[i],b=t.y+dy[i]; //计算可以走到的点 if(a<0||a>=n||b<0||b>=m) continue; //越界 if(st[a][b]) continue; //已经有颜色了 st[a][b]=c; //染色 tot++; //连通块大小增加 q.push({a,b}); //入队 } } } return tot; //返回连通块大小 } int main() { cin>>m>>n; for(int i=0;i<n;i++) { for(int j=0;j<m;j++) { cin>>g[i][j]; } } int cnt=0,maxv=0; for(int i=0;i<n;i++) { for(int j=0;j<m;j++) { if(!st[i][j]) { cnt++; //当前连通块需要染成的颜色 color[cnt]=bfs(i,j,cnt); //对应颜色的大小 maxv=max(maxv,color[cnt]); //更新最大值 } } } cout<<cnt<<endl<<maxv<<endl; maxv=0; int row,col; char d; for(int j=0;j<m;j++) { for(int i=n-1;i>=0;i--) { for(int k=1;k<=2;k++) { if(g[i][j]>>k&1) //当前位置是墙 { int a=i+dx[k],b=j+dy[k]; if(a<0||a>=n||b<0||b>=m) continue; int c1=st[i][j],c2=st[a][b]; if(c1!=c2) //如果颜色不相等 { int c=color[c1]+color[c2]; //计算去掉墙以后的连通块大小 if(c>maxv) //可以更新最大值 { maxv=c; row=i,col=j,d=chs[k]; } } } } } } cout<<maxv<<endl; cout<<row+1<<" "<<col+1<<" "<<d; return 0; }
- 1
資訊
- ID
- 787
- 時間
- 1000ms
- 記憶體
- 128MiB
- 難度
- (無)
- 标签
- 遞交數
- 0
- 已通過
- 0
- 上傳者