Cross

题目:

 

 

 

 

题意解析:

网格中有一些十字架,不会有两个十字架之间共享一个角的情况出现,请你输出,输入的网格中十字架长度从1到min(H,W)的数组。长度从1是指这样的十字架。

形成十字架的条件是:

  • C[a][b]是#。
  • C[a+d][b+d],C[a+d][bd],C[ad][b+d]和C[ad][bd]都是 “#” ,并且1≤dn。
  •  C[a+n+1][b+n+1],C[a+n+1][bn−1],C[an−1][b+n+1]C[an−1][bn−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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值