D题求问
#include <bits/stdc++.h>
using namespace std;
const int N =1e3+10;
int xx[]={0,-1,0,1};
int yy[]={1,0,-1,0};
bool check(vector<vector<int>>mp,int n,int m){
bool flag=false;
for(int i=0;i<n;i++){
for(int j=0;j<n;j++){
if(mp[i][j]==0){
int ans=0;
for(int k=0;k<4;k++){
int dx=i+xx[k],dy=j+yy[k];
if(dx<1||dx>n||dy<1||dy>m)continue;
if(mp[dx][dy]==1){
ans++;
}
}
if(ans==4)flag=true;
}
}
}
return flag;
}
void solve(vector<vector<int>>mp,int n,int m){
int sum=0;
int num_x[N],num_y[N];
memset(num_x,0,sizeof(num_x));
memset(num_y,0,sizeof(num_y));
for(int i=0;i<n;i++){
for(int j=0;j<m;j++){
if(mp[i][j]==1){
num_x[i]++;
num_y[j]++;
sum++;
}
}
}
int num_row_x=0,num_col_y=0;
for(int i=0;i<n;i++){
if(num_x[i]==m)num_row_x++;
}
for(int i=0;i<m;i++){
if(num_y[i]==n)num_col_y++;
}
bool ok = check(mp,n,m);
//这里存在问题
if(sum==0||(num_row_x==2&&sum==2*m)||(num_col_y==2&&sum==2*n)||ok){
//注意题目中 还说 可能操作同一行
cout<<"YES"<<endl;
}
else cout<<"NO"<<endl;
}
int main() {
int t;
cin >> t;
while (t--) {
int n, m;
cin >> n >> m;
vector<vector<int>> mp(N, vector<int>(N,0));
for (int i = 0; i < n; i++) {
string s;
cin >> s;
for (int j = 0; j < s.size(); j++) {
mp[i][j] = s[j] - '0';
}
}
solve(mp,n,m);
}
return 0;
}
为什么只能通过百分之15的样例