1 条题解
-
1
(🎉️ 第二次发题解🎉️)
方法思路
- 输入处理:读取城堡的尺寸n和m,然后读取每个方块的特征值到二维数组a中。
- BFS遍历:对于每个未被访问的方块,启动BFS遍历,统计连通区域的数量(房间数)和面积。使用队列来管理待访问的方块,检查四个方向的墙是否存在,如果没有墙则移动到相邻方块。
- 方向处理:使用dx和dy数组来表示四个方向(西、北、东、南),通过位运算检查对应方向的墙是否存在(1<<0对应西墙,1<<1对应北墙等)。
- 更新结果:每次完成一个连通区域的遍历后,更新最大房间面积,最后输出房间总数和最大面积
话不多说,上代码!
//万物皆可dfs #include<bits/stdc++.h> using namespace std; #define endl "\n" #define int long long int dx[]={0,-1,0,1}; int dy[]={-1,0,1,0}; //int dx[]={-1,1,0,0,-1,1,-1,1}; //int dy[]={0,0,-1,1,-1,1,1,-1}; struct point { int x; int y; }; const int N=1e5+5; int a[55][55]; int vis[55][55]; int n,m; int ans=0; int max_squ=0; signed main(){ std::ios::sync_with_stdio(false);cin.tie(0); //freopen(".in","r",stdin); //freopen(".out","w",stdout); cin>>n>>m; for(int i=0;i<n;i++){ for(int j=0;j<m;j++){ cin>>a[i][j]; } } for(int i=0;i<n;i++){ for(int j=0;j<m;j++){ if(!vis[i][j]){ ans++; queue<point> q; int s=0; vis[i][j]=1; q.push({i,j}); while(!q.empty()){ s++; point p=q.front(); q.pop(); int x=p.x; int y=p.y; int wall=a[x][y]; for(int k=0;k<4;k++){ if(!(wall&(1<<k))){ int nx=x+dx[k]; int ny=y+dy[k]; if(nx>=0 && nx<n && ny>=0 && ny<m && !vis[nx][ny]){ vis[nx][ny]=1; q.push({nx,ny}); } } } } max_squ=max(s,max_squ); } } } cout<<ans<<endl<<max_squ; return 0; }
和某道题一样,这道题也
很恶心还搞人心态有坑,你方向数组不对也会"寄" ,到时候没注意WA别说我没提醒你严禁拷贝!!!
(谁拷贝是**)
信息
- ID
- 240
- 时间
- 1000ms
- 内存
- 128MiB
- 难度
- 8
- 标签
- (无)
- 递交数
- 16
- 已通过
- 7
- 上传者