1 条题解

  • 1
    @ 2025-4-28 22:32:23

    (🎉️ 第二次发题解🎉️)


    方法思路

    1. 输入处理​:读取城堡的尺寸n和m,然后读取每个方块的特征值到二维数组a中。
    2. BFS遍历​:对于每个未被访问的方块,启动BFS遍历,统计连通区域的数量(房间数)和面积。使用队列来管理待访问的方块,检查四个方向的墙是否存在,如果没有墙则移动到相邻方块。
    3. 方向处理​:使用dx和dy数组来表示四个方向(西、北、东、南),通过位运算检查对应方向的墙是否存在(1<<0对应西墙,1<<1对应北墙等)。
    4. 更新结果​:每次完成一个连通区域的遍历后,更新最大房间面积,最后输出房间总数和最大面积

    话不多说,上代码!

    //万物皆可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
    上传者