当前位置: 首页 > news >正文

【搜索】P3654 First Step (ファーストステップ)

难度:普及-

算法:dfs

思路:

坑点:当 k == 1 时,需要除以2,因为向右向下搜索了两遍。

横着竖着都可以,因此搜索的时候按两种方向进行搜索;

如何不重复的搜索呢?

 把每一个合法的点(空地)都搜索一遍,从右方向搜索一遍,再从左方向搜索一遍。

因为我们要连续的一块地因此搜索的时候只能一个方向搜到底。

#include <bits/stdc++.h>
using namespace std;

#define int long long
#define endl '\n'

const int N = 110;

int n,m,k;
char mp[N][N];
int dx[2] = {0,1}, dy[2] = {1,0};  //偏移量向下、向右  
int ans;


//x表示横坐标,y表示纵坐标 
//u表示方向的坐标
//v表示 次数 
void dfs(int x,int y,int i,int u){
     if(u > k) {   
     	ans ++;
     	return;
	 } 
	 //判断不可行的情况
	 if(mp[x][y] == '#' || x < 0 || y < 0 || x >= n ||y >= m) return; 
	 
	 dfs(x + dx[i],y + dy[i],i,u + 1);
	 return;
}
signed main(){
	ios::sync_with_stdio(0);
	cin.tie(0);
	cout.tie(0);
	
	cin >> n >> m >> k;
	for(int i = 0; i < n; i++){
		cin >> mp[i];
	}
	
	for(int i = 0; i < n ; i++){
		for(int j = 0; j < m; j++){
			if(mp[i][j] == '.'){
				//为什么循环两次?因为可以向下向右两个方向进行搜索 
				for(int p = 0; p < 2; p ++){
				    dfs(i,j,p,1);  //为什么是 1 ,因为当前我脚下的是一片空地 
				}
			}
		}
	}
	if(k == 1){
		ans /= 2;   //如果 k = 1是需要除以2,因为我们向右,向下搜索了两遍 
	}
    cout << ans << endl;
	return 0;
} 

相关文章:

  • 备考六级:词汇量积累(day4)
  • 嵌入式学习L5D2-exec函数族和守护进程
  • 基于uniapp的蓝牙打印功能(佳博打印机已测试)
  • Linux 用户与组管理详解
  • 【LeetCode 热题 100】3. 无重复字符的最长子串 | python 【中等】
  • 算法策略深度解析与实战应用
  • 项目实战:Qt图像拼接渐进色图层生成工具v1.0.0(预设四路拼接,多路可通过多图叠层实现)
  • 再论滑动窗口与行头阻塞
  • Ai-web 1.0靶场通关攻略
  • 【HeadFirst系列之HeadFirst设计模式】第16天之生成器模式(Builder Pattern):让对象构建更优雅!
  • [力扣每日一练]关于所有不同域名的查找
  • 在命令的轨迹中:创建、删除与查看普通用户,Linux用户管理的风华与深邃
  • 嵌入式 ARM Linux 系统构成(4):设备驱动程序
  • 第十五届蓝桥杯 Python B 组省赛(满分题解)
  • 物联网的隧道监测场景中,要实现全面且有效的监测
  • 模型 - Qwen 2.5
  • 深度学习模型Transformer初步认识整体架构
  • 《几何原本》命题I.16
  • 江科大51单片机笔记【10】蜂鸣器(上)
  • char int string 的互相转换