题目:
题意解析:
网格中有一些十字架,不会有两个十字架之间共享一个角的情况出现,请你输出,输入的网格中十字架长度从1到min(H,W)的数组。长度从1是指这样的十字架。
形成十字架的条件是:
- C[a][b]是
#。
- C[a+d][b+d],C[a+d][b−d],C[a−d][b+d]和C[a−d][b−d]都是 “#” ,并且1≤d≤n。
- C[a+n+1][b+n+1],C[a+n+1][b−n−1],C[a−n−1][b+n+1]C[a−n−1][b−n−1中的至少一个是 “.”。
题解:
(1)找到是“#”的点从十字架形成的四个方向遍历,如果越界就返回d-1,然后遇见 “.” 也返回d-1。
(2)把遍历完了的数放入计数数组中。
(3)这里要注意的是题目中说的是输出的数长度是min(H,W),这里要注意一下,我因为没有看见这个条件,错了3次。
代码:
#include<bits/stdc++.h>
using namespace std;
int n,m;
vector<string> a(101);
vector<int> b(110);
int fx[4][2]= {{1,1},{-1,1},{-1,-1},{1,-1}};
int num(int x,int y) {
int d=1;
for(int d=1; d<=n; d++) {
for(int i=0; i<4; i++) {
int xx = x+fx[i][0]*d;
int yy = y+fx[i][1]*d;
if(xx>=n||xx<0||yy>=m||yy<0) {
return d-1;
}
if(a[xx][yy]=='.') {
return d-1;
}
}
}
}
int main() {
cin>>n>>m;
getchar();
for(int i=0; i<n; i++) {
cin>>a[i];
}
for(int i=0; i<n; i++) {
for(int j=0; j<m; j++) {
if(a[i][j]=='#') { //从多个方位判断
b[num(i,j)]++;
}
}
}
for(int i=1; i<=min(n,m); i++) {
cout<<b[i]<<' ';
}
return 0;
}