题意 图中的*是否可以由 十字形的* 覆盖 (组成的十字架必须是从中心出发上下左右长度一样)十字架相互之间可以覆盖重叠 也就是两十字架可以公用边 这题简单和复杂两个版本都能暴力过去 就是遍历一遍数组 把每个十字架找出来然后标记一下 最后便利一下看有没有没有被标记到的*
#include<bits/stdc++.h>
using namespace std;
char s[1005][1005];
int vis[1005][1005];
struct Node{
int x,y,l;
Node(int a,int b,int c):x(a),y(b),l(c){}
};
vector<Node>ans;
int main(){
int n,m;
scanf("%d%d",&n,&m);
for(int i=0;i<n;i++){
scanf("%s",s[i]);
}
int l;
for(int i=0;i<n;i++)
for(int j=0;j<m;j++){
int best=0;
if(s[i][j]=='*'){
for(int k=1; i-k>=0 && i+k<n && j-k>=0 && j+k<m; k++){
if(s[i-k][j]=='*'&&s[i+k][j]=='*'&&s[i][j+k]=='*'&&s[i][j-k]=='*'){
// cout<<i<<" "<<j<<" "<<k<<endl;
best++;
vis[i-k][j]=vis[i+k][j]=vis[i][j+k]=vis[i][j-k]=1;
}
else break;
}
if(best){
vis[i][j]=1;
ans.push_back(Node(i+1, j+1, best));
}
}
}
int ok=1;
for(int i=0;i<n;i++)
for(int j=0;j<m;j++)
if(vis[i][j]==0&&s[i][j]=='*'){
ok=0;break;
}
if(ok){
int l=ans.size();
cout<<l<<endl;
for(int i=0;i<l;i++){
printf("%d %d %d\n",ans[i].x,ans[i].y,ans[i].l);
}
}
else cout<<-1<<endl;
return 0;
}