3 条题解

  • -3
    @ 2021-12-21 23:37:31
    
    
    
    思路:求出联通块里#号的个数以后,再去确定一下该联通块所在的矩形面积是否和#个数相等
    求矩形:做完BFS求出个数以后,从当前第一个#(i,j)开始,保持行不变,列向右找到当前的长l,然
    后从第一个#保持列不变,找到当前的宽w。此时右边的#的坐标就是(i,j+l-1).
    根据这个#向左确定一个l1,向下确定一个w1。
    求出l1*w1和l*w的最小值和个数sum比较。相等就是矩形。
    .###
    ###.
    .###
    ###.
    .###
    如该图,如果只求了l和w会发现l*w=15,和sum相等但是该图不是矩形
    #include<bits/stdc++.h>
    using namespace std;
    int n,m,ans1,ans2,sum1,l,w,l1,w1;
    char a[85][85];
    bool vis[85][85];
    int dx[4]={-1,0,1,0};
    int dy[4]={0,1,0,-1};
    struct point
    {
    	int x,y;
    };
    queue<point> q;
    void bfs(int x,int y)//求联通块个数的模板代码
    {
    	vis[x][y]=true;
    	q.push((point){x,y});
    	while(q.size()>0)
    	{
    		point now=q.front();
    		q.pop();
    		for(int i=0;i<4;i++)
    		{
    			int nx=now.x+dx[i];
    			int ny=now.y+dy[i];
    			if(nx>=1&&nx<=n&&ny>=1&&ny<=m&&!vis[nx][ny]&&a[nx][ny]=='#')
    			{
    				vis[nx][ny]=true;
    				sum1++;
    				q.push((point){nx,ny});
    			}
    		}
    	}
    }
    int main()
    {
    	cin>>n>>m;
    	for(int i=1;i<=n;i++)
    		for(int j=1;j<=m;j++)
    			cin>>a[i][j];
    	for(int i=1;i<=n;i++)
    	{
    		for(int j=1;j<=m;j++)
    		{
    			if(a[i][j]=='#'&&!vis[i][j])//注意bfs的条件
    			{
    				sum1=1;//个数初始都是1
    				bfs(i,j);
    				l=0,w=0,l1=0,w1=0;
    				for(int q=i;q<=n;q++)//固定列j,从第q行向下找到宽w
    				{
    					if(a[q][j]=='#') w++;
    					if(a[q][j]!='#') break;
    				}
    				for(int q=j;j<=m;q++)//固定行i,从第q列向右找到长l
    				{
    					if(a[i][q]=='#') l++;
    					if(a[i][q]!='#') break;
    				}
    				for(int q=j+l-1;q>=1;q--)//固定行i,从第q列向左找到长l1
    				{
    					if(a[i][q]=='#') l1++;
    					if(a[i][q]!='#') break;
    				}
    				for(int q=i;q<=n;q++)//固定列j+l-1,从第q行乡下找到宽w1
    				{
    					if(a[q][j+l-1]=='#') w1++;
    					if(a[q][j+l-1]!='#') break;
    				}
    				if(min(l1*w1,l*w)==sum1) ans1++;
    				else ans2++;
    			}
    		}
    	}
    	cout<<ans1<<endl<<ans2;
    	return 0;
    }
    • -5
      @ 2022-4-24 17:47:16

      写题解请注意

      鼓励大家写题解,但注意题解格式。

      题解一定要有思路解析或代码注释,能否让别人理解你的思路

      也是你的能力的检验,不要只放无意义的代码给大家复制,那就失去了做题的初心。

      给代码两端加上这个会舒服一些

      ```cpp

      你的代码

      ```

      </span>

      这个点在键盘的左上角tab上面那个键,注意切换输入法

      #include<iostream>
      using namespace std;
      int main()
      {
          int n;
          cin>>n;//这是一个注释
          return 0;
      } 
      

      请注意严禁抄袭题解,写题解不要只放代码,需加上你的思路或代码注释。

      抄袭题解一经发现直接取消成绩。

      题解被删除的可能

      1. 代码不符合格式规范
      2. 没有思路讲解或者没有注释,
      3. 无意义的题解

      大家携手共同维护一个良好的编程环境,如果一经发现,多次作乱。可能会被管理员拉黑,请注意,一旦拉黑即失去登陆资格。

      • -5
        @ 2022-4-19 22:36:19

        严禁抄题解,发现后取消成绩

        • 1

        信息

        ID
        437
        时间
        1000ms
        内存
        128MiB
        难度
        1
        标签
        递交数
        40
        已通过
        30
        上传者