首页 > 其他分享 >【题解】【枚举】——First Step (ファーストステップ)

【题解】【枚举】——First Step (ファーストステップ)

时间:2024-09-15 20:22:33浏览次数:8  
标签:min int 题解 枚举 leq Step stand 100 First

【题解】【枚举】——First Step ファーストステップ

First Step (ファーストステップ)

原题在洛谷上

题目背景

我们 Aqours,要第一次举办演唱会啦!

虽然学生会长看上去不怎么支持我们的样子,可是有了理事长的支持,我们还是被允许在校内的篮球场里歌唱!

歌曲也好好地准备过了,名字叫“最喜欢的话就没问题! (ダイスキだったらダイジョウブ!)“,大家一定会喜欢的吧!

演唱会一定会顺利进行的!

希望不要发生停电什么的事故哦……!

题目描述

可是……这个篮球场,好像很久没有使用过的样子啊……

里面堆满了学校的各种杂物呢……

我们 Aqours 的成员要怎么在里面列队站下呢?

我们浦之星女子学院的篮球场是一个 R R R 行 C C C 列的矩阵,其中堆满了各种学校的杂物 (用 # 表示),空地 (用 . 表示) 好像并不多的样子呢……

我们 Aqours 现在已经一共有 K K K 个队员了,要歌唱舞蹈起来的话,我们得排成一条 1 × K 1\times K 1×K 的直线,一个接一个地站在篮球场的空地上呢 (横竖均可)。

我们想知道一共有多少种可行的站位方式呢。

Aqours 的真正的粉丝的你,能帮我们算算吗?

输入格式

第一行三个整数 R , C , K R, C, K R,C,K。

接下来的 R R R 行 C C C 列,表示浦之星女子学院篮球场。

输出格式

总共的站位方式数量。

输入输出样例

输入 #1

5 5 2
.###.
##.#.
..#..
#..#.
#.###

输出 #1

8

提示

R R R C C C K K K备注
1 ∼ 2 1\sim2 1∼2 ≤ 10 \leq 10 ≤10 ≤ 10 \leq 10 ≤10 ≤ min ⁡ ( R , C ) \leq \min(R,C) ≤min(R,C)
3 ∼ 4 3\sim4 3∼4 ≤ 100 \leq 100 ≤100 ≤ 100 \leq 100 ≤100 ≤ 1 \leq 1 ≤1
5 ∼ 6 5\sim6 5∼6 ≤ 100 \leq 100 ≤100 ≤ 100 \leq 100 ≤100 ≤ min ⁡ ( R , C ) \leq \min(R,C) ≤min(R,C)没有障碍
7 ∼ 10 7\sim10 7∼10 ≤ 100 \leq 100 ≤100 ≤ 100 \leq 100 ≤100 ≤ min ⁡ ( R , C ) \leq \min(R,C) ≤min(R,C)

对于所有数据, 1 ≤ R , C ≤ 100 1 \leq R,C \leq 100 1≤R,C≤100, 1 ≤ k ≤ min ⁡ ( R , C ) 1 \leq k \leq \min(R,C) 1≤k≤min(R,C)。

1.思路解析

    如果只能横着或只能竖着站,直接暴力枚举就行了。

    但是这道题横竖均可,怎么办?那就分别枚举横着和竖着两种情况就行了。

    我们先讨论横着站的情况。使用一个变量cnt来储存答案。
    最外层的循环枚举每一行,如下:

for(int i=1;i<=R;i++)//首先枚举横着站的情况,i代表当前枚举的行数
{
    
}

    第二重循环枚举每种可能的队头,即起点。注意最多枚举到C-K+1

for(int i=1;i<=R;i++)//首先枚举横着站的情况,i代表当前枚举的行数
{	
    for(int j=1;j<=C-K+1;j++)//以第i行每一个可以作为起点的点j作为起点
    {
        
	}
}

    接下来就是枚举后面的 K K K个位置了。首先定义一个变量is_can_stand,储存当前情况是否站的下,初始化为1。然后枚举后面的 K K K个位置,只要遇到障碍物#就跳出循环,并把is_can_stand设置为0

for(int i=1;i<=R;i++)//首先枚举横着站的情况,i代表当前枚举的行数
{	
    for(int j=1;j<=C-K+1;j++)//以第i行每一个可以作为起点的点j作为起点
    {
    	bool is_can_stand=1;//是否可以站下 
    	for(int k=j;k<=K+j-1;k++)//分别枚举K个人站的位置
    	    if(a[i][k]!='.')//如果不是空地
    	    {
    	        is_can_stand=0;
				break;//不再判断以这个点为起点的可能性
			}
    	if(is_can_stand)//统计答案
    	    cnt++;
	}
}

    枚举竖着站和枚举横着站有异曲同工之妙,请读者自己尝试实现。

    注意:当 K = 1 K=1 K=1时,横着站和竖着站是一样的,此时需要答案/2

本题解只讲述了一种适合萌新的做法,其实还有许多可以优化的地方。但因为我懒篇幅关系,这里就不详细讲解了。

2.AC代码

#include<bits/stdc++.h>
using namespace std;
int R,C,K,cnt;//用cnt记录答案 
char a[110][110];//储存篮球场地图 
int main()
{
    cin>>R>>C>>K;
    for(int i=1;i<=R;i++)//读入地图 
        for(int j=1;j<=C;j++)
            cin>>a[i][j];
    for(int i=1;i<=R;i++)//首先枚举横着站的情况,i代表当前枚举的行数
    {	
    	for(int j=1;j<=C-K+1;j++)//以第i行每一个可以作为起点的点j作为起点
    	{
    		bool is_can_stand=1;//是否可以站下 
    		for(int k=j;k<=K+j-1;k++)//分别枚举K个人站的位置
    	        if(a[i][k]!='.')//如果不是空地
    	        {
    	        	is_can_stand=0;
					break;//不再判断以这个点为起点的可能性
				}
    	    if(is_can_stand)//统计答案
    	        cnt++;
		}
	}
	for(int i=1;i<=C;i++)//然后枚举竖着站的情况,i代表当前枚举的列数
	{
		for(int j=1;j<=R-K+1;j++)以第i列每一个可以作为起点的点j作为起点
		{
			bool is_can_stand=1;//是否可以站下
			for(int k=j;k<=K+j-1;k++)//分别枚举K个人站的位置
			    if(a[k][i]!='.')//如果不是空地
			    {
			    	is_can_stand=0;
			    	break;//不再判断以这个点为起点的可能性
				}
			if(is_can_stand)//统计答案
			    cnt++;
		}
	}
	(K==1)?cout<<cnt/2:cout<<cnt;
	//如果只需要站一个人,那么横着站和竖着站计算了两次,需要除以2
	return 0;
}

喜欢就订阅此专辑吧!

【蓝胖子编程教育简介】
蓝胖子编程教育,是一家面向青少年的编程教育平台。平台为全国青少年提供最专业的编程教育服务,包括提供最新最详细的编程相关资讯、最专业的竞赛指导、最合理的课程规划等。本平台利用趣味性和互动性强的教学方式,旨在激发孩子们对编程的兴趣,培养他们的逻辑思维能力和创造力,让孩子们在轻松愉快的氛围中掌握编程知识,为未来科技人才的培养奠定坚实基础。

欢迎扫码关注蓝胖子编程教育
在这里插入图片描述

标签:min,int,题解,枚举,leq,Step,stand,100,First
From: https://blog.csdn.net/Pantheraonca/article/details/142024829

相关文章

  • 【题解】【数组】—— [NOIP2005 普及组] 校门外的树
    【题解】【数组】——[NOIP2005普及组]校门外的树[NOIP2005普及组]校门外的树题目描述输入格式输出格式输入输出样例输入#1输出#1提示1.题意解析2.AC代码[NOIP2005普及组]校门外的树通往洛谷的传送门题目描述某校大门外长度为......
  • 2024ICPC网络赛第一场题解(部分)
    这一场基本纯挂件,给队友翻译翻译题面,帮队友打打板子了,可惜最后40sL题冲了一个\(O(\frac{n^3}{w})\)的bitset最后wa了,所以下面的题解我也只能看着队友代码说说大概,主要参考一下代码吧。A题意给出32个队伍的能力值,和比赛的规则,其中中国队是第一个队伍,问所有分组的情况下,中国队......
  • 1928.规定时间内到达终点的最小话费,题解
    1928.规定时间内到达终点的最小花费-力扣(LeetCode)有点难,参考官方题解代码:利用了动态规划思想,逐步计算从起点到各个城市在不同时间下的最小费用。 1.代码解释,涉及,static关键字,constexpr关键字,INT_MAX除以2赋值的含义staticconstexprintINFTY=INT_MAX/2; 1.**`......
  • Hetao P1391 操作序列 题解 [ 绿 ] [ 二维线性 dp ]
    操作序列:简单的二维dp。观察我们每次操作可以让\(x\)变为\(2x-1\),或者当\(x\)为奇数时让\(x\)变为\(\frac{x+1}{2}\)。显然,执行第一种操作,会使\(x\)变成奇数。那一旦我们连续执行两次操作,\(x\)就会变为:\[\frac{(2x+1)-1}{2}=\frac{2x}{2}=x\]也就是说,当\(x\)......
  • 语言 题解
    语言题解本题其实没有什么好说的,主要是提供一种强大的,神秘的,诡异的,跑得飞快的,逆天的,唐诗的双\(\log\)做法首先考虑将答案分类,分成跨过这个语言的lca的和没跨过的对于没跨过的,可以发现就是对于每个点,求能扩展到的深度最低的节点,这个直接暴力做就是\(O(n)\)的,所以说我们直......
  • 题解:AT_pakencamp_2019_day3_d パ研軍旗
    题意简述给定\(5\)行\(N\)列的网格,每个格子有四种可能的颜色。要使网格中每一列的颜色都一样但不能是黑色,并且相邻两列的颜色不相同。问最少改变多少个格子的颜色能满足要求。思路分析为方便处理,把给定的红色、蓝色、白色、黑色分别转成数字\(1,2,3,4\)。考虑dp。不妨......
  • 题解:AT_abc371_c [ABC371C] Make Isomorphic
    题目大意有两个简单无向图,你每一次可以给第二个图添上或去掉一条边,有相应花费,问将两个图变为同构最少需要花费多少钱。思路观察数据范围,可以发现NNN非常小,可以考虑枚......
  • 「KDOI-06-S」题解
    T2树上异或题面分析树形DP题考虑一颗子树内部的某种割边方式,假设其被分为\(n\)个连通块,每个连通块的权值分别为\(a_1,a_2,\dots,a_n\),那么该子树在这种割边方式下对答案的贡献就为\(\prod_{i=1}^{n}a_i\)。因此就可以从叶子向根不断合并,求出每种割边状态的值,时......
  • 【洛谷 P1596】[USACO10OCT] Lake Counting S 题解(深度优先搜索)
    [USACO10OCT]LakeCountingS题面翻译由于近期的降雨,雨水汇集在农民约翰的田地不同的地方。我们用一个的网格图表示。每个网格中有水(W)或是旱地(.)。一个网格与其周围的八个网格相连,而一组相连的网格视为一个水坑。约翰想弄清楚他的田地已经形成了多少水坑。给出约翰田地的示意图,......
  • Codeforces Round 972 (Div. 2) 2005C. Lazy Narek 题解
    原题链接:https://codeforces.com/contest/2005/problem/C看了教程发现都是用dp做的,在这里分享一个差不多的SPFA的思路(赛场上忘了Dijkstra不能有负边所以炸了)时间复杂度与dp同样是O(nm)形式化题意和翻译:有n个长度为m的字符串,你可以选择或不选择来拼接它们,但是不能更改字符串的......