3 条题解
-
-3
思路:求出联通块里#号的个数以后,再去确定一下该联通块所在的矩形面积是否和#个数相等 求矩形:做完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
写题解请注意 鼓励大家写题解,但注意题解格式。
题解一定要有思路解析或代码注释,能否让别人理解你的思路
也是你的能力的检验,不要只放无意义的代码给大家复制,那就失去了做题的初心。
给代码两端加上这个会舒服一些
```cpp
你的代码
```
</span>
这个点在键盘的左上角tab上面那个键,注意切换输入法
#include<iostream> using namespace std; int main() { int n; cin>>n;//这是一个注释 return 0; }
请注意严禁抄袭题解,写题解不要只放代码,需加上你的思路或代码注释。
抄袭题解一经发现直接取消成绩。
题解被删除的可能
- 代码不符合格式规范
- 没有思路讲解或者没有注释,
- 无意义的题解
大家携手共同维护一个良好的编程环境,如果一经发现,多次作乱。可能会被管理员拉黑,请注意,一旦拉黑即失去登陆资格。
- 1
信息
- ID
- 437
- 时间
- 1000ms
- 内存
- 128MiB
- 难度
- 1
- 标签
- 递交数
- 40
- 已通过
- 30
- 上传者