原题链接:

大致题意:给你一个二维字符串,可以看成图;再给两个子串“girl”和“cat”,求图中任意起点开始的不间断连接起来的字母构成的两个子串的分别的个数;连接的方向只有不间断的上下左右。

搜索函数:

void dfsgirl(int i, int j,int k);

//第一层(i1,j1,  k=0)时,k=0表示(i1,j1)上是g,然后枚举四个方位找到i——进入第二层
//第二层(i2,j2,   k=1)时,k=1表示(i2,j2)位置上是字母i(并且该位置与i1,j1相邻,这是为什么?),然后枚举四个方位找到r——进入第三层
//第三层(i3,j3,k=2),k=2表示(i3,j3)位置上是字母r(并且该位置与i2,j2相邻,为什么?)然后枚举四个方位找到l——进入第四层
//第四层(i4,j4,k=3),找到l就要停下来了,直接记录结果并范围上一层,接着执行下一个方位的dfs。(为什么这时可以停下了呢?因为dfs都是环环相扣的,前面的解都是合理的,然后推出后面的解;再后面的解以此为基础,再往下搜索!)

void dfscat(int i, int j,int k);

道理同上,自己照葫芦画瓢可以写写就懂得差不多了。

//main函数里确保了每个起点不同,并且每个字符串不是回文字符串,所以确保不会走重复的!自己举个栗子试试!

//再看不懂就直接去动手画画推推好了,或者调试吧!单步调试可以清晰直接地看出机器的逻辑!


没有思路就不要盲目做题。抄代码是一种不好的习惯,代码如下:

#include<stdio.h>
#include<string.h>
#include<math.h>
#include<iostream>
#include<algorithm>
using namespace std;
void dfscat(int i, int j,int k);
void dfsgirl(int i, int j,int k);
#define N 1010
char str[N][N];
char s1[]= "girl"; //声明需要查找的字符串
char s2[]= "cat";
int m,n,sum,num,k,p;
int main()
{
int T,i,j;
scanf("%d",&T);
while(T--)
{
sum=; //girl的数量
num=; //cat的数量
k=;
p=;
memset(vis,,sizeof(vis));
scanf("%d%d",&n,&m);
for(i=; i<n; i++) //存贮一整个图
scanf("%s",str[i]);
for(i=; i<n; i++)
for(j=; j<m; j++)
{
if(str[i][j]=='g')
dfsgirl(i,j,);
if(str[i][j]=='c')
dfscat(i,j,);
}
printf("%d %d",sum,num);
printf("\n");
}
return ;
} //第一层(i1,j1,k=0)时,k=0表示(i1,j1)上是g,然后枚举四个方位找到i——进入第二层
//第二层(i2,j2,k=1)时,k=1表示(i2,j2)位置上是字母i(并且该位置与i1,j1相邻,这是为什么?),然后枚举四个方位找到r——进入第三层
//第三层(i3,j3,k=2),k=2表示(i3,j3)位置上是字母r(并且该位置与i2,j2相邻,为什么?)然后枚举四个方位找到l——进入第四层
//第四层(i4,j4,k=3),找到l就要停下来了,直接记录结果并范围上一层,接着执行下一个方位的dfs。(为什么这时可以停下了呢?因为dfs都是环环相扣的,前面的解都是合理的,然后推出后面的解;再后面的解以此为基础,再往下搜索!) //main函数里确保了每个起点不同,并且每个字符串不是回文字符串,所以确保不会走重复的!自己举个栗子试试! //再看不懂就直接去动手画画推推好了,或者调试吧!单步调试可以清晰直接地看出机器的逻辑! void dfsgirl(int i, int j,int k) //k表示当前步要搜索s1[4]=“girl”的下标
{
if(i<||j<||i>=n||j>=m)
return;
else
{
if(str[i][j]==s1[k])
{
if(k==) //找到最后一个字母
{
sum++;
return ;
}
dfsgirl(i-,j,k+);
dfsgirl(i,j-,k+);
dfsgirl(i+,j,k+);
dfsgirl(i,j+,k+);
}
}
return ;
} void dfscat(int i, int j,int k) ////k表示当前步要搜索s2[3]=“cat”的下标
{
if(i<||j<||i>=n||j>=m)
return;
else
{
if(str[i][j]==s2[k])
{
if(k==) //找到最后一个字母
{
num++;
return ;
}
dfscat(i-,j,k+);
dfscat(i,j-,k+);
dfscat(i+,j,k+);
dfscat(i,j+,k+);
}
}
return ;
}

HDU - 5706 - Girlcat - 简单搜索 - 新手都可以看懂的详解的更多相关文章

  1. 超详细,新手都能看懂 !使用SpringBoot+Dubbo 搭建一个简单的分布式服务

    来自:JavaGuide Github 地址:https://github.com/Snailclimb/springboot-integration-examples 目录: 使用 SpringBo ...

  2. 新手也能看懂的 SpringBoot 异步编程指南

    本文已经收录自 springboot-guide : https://github.com/Snailclimb/springboot-guide (Spring Boot 核心知识点整理. 基于 S ...

  3. 小学生都能看懂的FFT!!!

    小学生都能看懂的FFT!!! 前言 在创新实践重心偷偷看了一天FFT资料后,我终于看懂了一点.为了给大家提供一份简单易懂的学习资料,同时也方便自己以后复习,我决定动手写这份学习笔记. 食用指南: 本篇 ...

  4. 55张图吃透Nacos,妹子都能看懂!

    大家好,我是不才陈某~ 这是<Spring Cloud 进阶>第1篇文章,往期文章如下: 五十五张图告诉你微服务的灵魂摆渡者Nacos究竟有多强? openFeign夺命连环9问,这谁受得 ...

  5. 机器学习敲门砖:任何人都能看懂的TensorFlow介绍

    机器学习敲门砖:任何人都能看懂的TensorFlow介绍 http://www.jiqizhixin.com/article/1440

  6. 只要听说过电脑的人都能看懂的网上pdf全书获取项目

    作者:周奇 最近我要获取<概统>的教材自学防挂科(线代已死),于是我看到 htt链ps:/链/max链.book接118接.com接/html/2018/0407/160495927.sh ...

  7. 搭建分布式事务组件 seata 的Server 端和Client 端详解(小白都能看懂)

    一,server 端的存储模式为:Server 端 存 储 模 式 (store-mode) 支 持 三 种 : file: ( 默 认 ) 单 机 模 式 , 全 局 事 务 会 话 信 息 内 存 ...

  8. 小学生都能看懂的数位dp

    前言 数位dp其实很久前就知道了,也做过几道和其他算法混在一起的题目,其实通过手玩是能做的 但毕竟是种算法,还是系统学下比较好(节省手玩时间) 模板题 P2602 [ZJOI2010]数字计数 化简题 ...

  9. 谁都能看懂的单点登录(SSO)实现方式(附源码)

    SSO的基本概念 SSO英文全称Single Sign On(单点登录).SSO是在多个应用系统中,用户只需要登录一次就可以访问所有相互信任的应用系统.它包括可以将这次主要的登录映射到其他应用中用于同 ...

随机推荐

  1. 常见问题:计算机网络/运输层/UDP

    几乎不对IP增加其他东西,无连接. 优势 速度快.适合实时. 无连接建立,没有连接时延. 无连接状态. 分组首部开销小.TCP需20字节,UDP仅需8字节. 使用UDP的协议 DNS SNMP RIP ...

  2. Tensorflow-逻辑斯蒂回归

    1.交叉熵 逻辑斯蒂回归这个模型采用的是交叉熵,通俗点理解交叉熵 推荐一篇文章讲的很清楚: https://www.zhihu.com/question/41252833 因此,交叉熵越低,这个策略就 ...

  3. 探索typescript的必经之路-----接口(interface)

    TypeScript定义接口 熟悉编程语言的同学都知道,接口(interface)的重要性不言而喻. 很多内容都会运用到接口.typescrip中的接口类似于java,同时还增加了更灵活的接口类型,包 ...

  4. 【剑指offer】面试题 52. 两个链表的第一个公共结点

    面试题 52. 两个链表的第一个公共结点 NowCoder 题目描述 输入两个链表,找出它们的第一个公共结点. Java 实现 ListNode Class class ListNode { int ...

  5. LeetCode 21. 合并两个有序链表(Merge Two Sorted Lists)

    21. 合并两个有序链表 21. Merge Two Sorted Lists 题目描述 将两个有序链表合并为一个新的有序链表并返回.新链表是通过拼接给定的两个链表的所有节点组成的. LeetCode ...

  6. Cookies和Sessions

    Cookie和Session 为什么会有cookie和session? 由于http协议是无状态的 无法记住用户是谁,cookie主要是在浏览器上记录客户的状态,session主要是用来在服务端记录客 ...

  7. HDOJ-1100 Trees made to order

    一.题目链接 http://acm.hdu.edu.cn/showproblem.php?pid=1100 二.题目分析 对二叉树的所有形态顺序编号,编号规则是:节点数越多的编号越大:节点数相等,左子 ...

  8. 【mapreudce】6.对Nginx的access日志进行数据清洗,我们提取出文件数据的ip,时间,url

    1.首先我们需要一个util辅助类 package cn.cutter.demo.hadoop.mapreduce.nginxlog.util; import java.text.ParseExcep ...

  9. html页面在苹果手机内,safari浏览器,微信中滑动不流畅问题解决方案

    1. -webkit-overflow-scrolling:touch是什么? MDN上是这样定义的: -webkit-overflow-scrolling 属性控制元素在移动设备上是否使用滚动回弹效 ...

  10. javascript之instanceof

    定义和用法 instanceof 运算符用来检测 constructor.prototype 是否存在于参数 object 的原型链上. 语法: object instanceof construct ...