社区讨论

团队题目求助

灌水区参与者 2已保存回复 2

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
2 条
当前快照
1 份
快照标识符
@m690e9ac
此快照首次捕获于
2025/01/23 15:26
去年
此快照最后确认于
2025/11/04 10:49
4 个月前
查看原帖

题目:

笑里藏刀

题目背景

信而安之,阴以图之。备而后动,勿使有变。刚中柔外也。

题目描述

33DAI 拿到了一副 nnmm 列的二维字符画,字符画中的 n×mn\times m 个字符都是 2626 个小写英文字母中的一个。33DAI 认为 v 是个笑脸,而如果有一些 v 构成了一个开口朝着左上方的直角,就认为这是一把刀。比如下面的所有 v 就构成了一个开口朝着左上方的直角:
CPP
oooov
oooov
ovvvv
形式化的说,如果有一个 v 左边有连续的不少于一个 v,上面也有连续的不少于一个 v,那么这些 v 就构成了一个开口朝着左上方的直角,33DAI 就认为是一把刀。
33DAI 认为只要形状不同或者位置不同就是不同的刀,所以上面的那个例子中有 66 把刀。(下面展现了那六把刀的位置,和刀无关的部分都用 o 表示了。)
CPP
ooooo  oooov  ooooo  oooov  ooooo  oooov  
oooov  oooov  oooov  oooov  oooov  oooov  
ooovv  ooovv  oovvv  oovvv  ovvvv  ovvvv  
现在给你一个 nnmm 列的二维字符画,请你数数有多少把刀吧!

输入格式

第一行为两个整数 n,mn,m
接下来 nn 行,每行有 mm 个字符,即 n×mn\times m 的字符画。

输出格式

一个整数,即刀的数量。

样例 #1

样例输入 #1

CPP
3 5
oooov
oovov
ovvvv

样例输出 #1

CPP
7

样例 #2

样例输入 #2

CPP
3 5
vvoov
vooov
ovvvv

样例输出 #2

CPP
6

样例 #3

样例输入 #3

CPP
3 3
vvv
vvv
vvv

样例输出 #3

CPP
9

样例 #4

样例输入 #4

CPP
10 10
vvvvvoovvv
oovvvvvvvv
ovvvvvvooo
vvvvooovvv
vvvvvvvvvv
vvvvvvvvvv
vvvvvvvvvv
vvvvvvvvvv
vvvvvvovvv
vvvvvvvvvv

样例输出 #4

CPP
850

提示

样例1解释:
在题目描述的基础上多加了一把刀,新刀的位置是:
CPP
ooooo
oovoo
ovvoo
样例2解释:
虽然多了一个直角,但是这个直角的开口是朝右下的,所以没有多出来的刀。

数据规模与约定

对于 100%100\% 的数据,1n,m20001 \le n,m \le 2000
  • 子任务 1(10 分):保证 n=m=2n=m=2
  • 子任务 2(20 分):保证 n=2n=2
  • 子任务 3(30 分):保证 1n,m1001\le n,m\le 100
  • 子任务 4(40 分):没有特殊限制。

我的代码:

CPP
#include<bits/stdc++.h>
#define int long long
using namespace std;
int n,m,cnt;
char a[2010][2010];
char fleft[2010][2010],up[2010][2010];
signed main(){
    cin>>n>>m;
    for(int i=1;i<=n;i++) for(int j=1;j<=m;j++) cin>>a[i][j];
    for(int i=1;i<=n;i++) 
		for(int j=1;j<=m;j++){
			if(a[i][j]=='v') fleft[i+1][j]=fleft[i][j]+1,up[i][j+1]=up[i][j]+1;
			else fleft[i][j]=up[i][j]=0;
		}
    for(int i=1;i<=n;i++)
        for(int j=1;j<=m;j++){
            if(a[i][j]=='o') continue;
			cnt+=fleft[i][j]*up[i][j];
        }
    cout<<cnt;
    return 0;
}
这个代码只得了80分,不知道为什么,求助大佬!

回复

2 条回复,欢迎继续交流。

正在加载回复...