题意很简单,就是问你是否存在一个完整的全一矩形,并且矩形外没有1存在;
思路也很简单:
1.两个for枚举 到第一个1时,标记第一个的坐标,那么如果存在全一矩阵,那么这个1必定是矩阵的左上角;
2.找出由1组成的长和宽;
3.在这个选出来的矩形中找是否存在0;
4.在矩形外面找是否存在1;
所以AC代码:
#include<bits/stdc++.h>
using namespace std;
int main(){
int n,m;
char A[51][51];//整个矩阵
int book[51][51];//标记数组
while(~scanf("%d %d",&n,&m)){
memset(book,0,sizeof(book));
for(int i=0;i<n;i++){
scanf("%s",A[i]);
}
int cnt1=0,cnt2=0,r,l;
int f=0;
for(int i=0;i<n;i++){//找出第一个1
for(int j=0;j<m;j++){
if(A[i][j]=='1'){
r=i;l=j;//记录第一个1的位置
for(int k=j;k<m;k++){//列
if(A[i][k]=='1')cnt1++;
else break;
}
for(int k=i;k<n;k++){//行
if(A[k][j]=='1')cnt2++;
else break;
}
f=1;
break;
}
}
if(f)break;
}
if(!f){//如果没有1,那么全为0,说明不存在(根据题意可以知道)
puts("No");continue;
}
// cout<<r<<" "<<d<<endl;
// cout<<cnt1<<" "<<cnt2<<endl;
int flag1=0;
for(int i=r;i<r+cnt2;i++){//找,划出来的矩阵里面是不是全为1
for(int j=l;j<l+cnt1;j++){
if(A[i][j]=='0'){
flag1=1;break;
}else book[i][j]=1;
}
if(flag1)break;
}
if(flag1)puts("No");
else{
int flag2=0;
for(int i=0;i<n;i++){//看看 在划出来的矩阵外面有没有1存在
for(int j=0;j<m;j++){
if(!book[i][j]){
if(A[i][j]=='1'){
flag2=1;break;
}
}
}
if(flag2)break;
}
if(flag2)puts("No");///如果存在,则不能构成一个完整的全一矩形
else{
puts("Yes");
}
}
}
return 0;
}