HDU - 5706 - Girlcat - 简单搜索 - 有新手都可以看懂的详解

原题链接:

大致题意:给你一个二维字符串,可以看成图;再给两个子串“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=0;  //girl的数量
        num=0;  //cat的数量
        k=0;
        p=0;
        memset(vis,0,sizeof(vis));
        scanf("%d%d",&n,&m);
        for(i=0; i<n; i++)    //存贮一整个图
            scanf("%s",str[i]);
        for(i=0; i<n; i++)
            for(j=0; j<m; j++)
            {
                if(str[i][j]==‘g‘)
                    dfsgirl(i,j,0);
                if(str[i][j]==‘c‘)
                    dfscat(i,j,0);
            }
        printf("%d %d",sum,num);
        printf("\n");
    }
    return 0;
}

//第一层(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<0||j<0||i>=n||j>=m)
        return;
    else
    {
        if(str[i][j]==s1[k])
        {
            if(k==3)  //找到最后一个字母
            {
                sum++;
                return ;
            }
            dfsgirl(i-1,j,k+1);
            dfsgirl(i,j-1,k+1);
            dfsgirl(i+1,j,k+1);
            dfsgirl(i,j+1,k+1);
        }
    }
    return ;
}

void dfscat(int i, int j,int k)  ////k表示当前步要搜索s2[3]=“cat”的下标
{
    if(i<0||j<0||i>=n||j>=m)
        return;
    else
    {
        if(str[i][j]==s2[k])
        {
            if(k==2)   //找到最后一个字母
            {
                num++;
                return ;
            }
            dfscat(i-1,j,k+1);
            dfscat(i,j-1,k+1);
            dfscat(i+1,j,k+1);
            dfscat(i,j+1,k+1);
        }
    }
    return ;
}

原文地址:https://www.cnblogs.com/zhazhaacmer/p/8403584.html

时间: 2024-11-09 07:59:08

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

db2数据库新手可能碰到的问题及详解(部分内容来自网络搜索)

一.db2安装好之后出现乱码,菜单栏呈现方框状,此时选择菜单第五项,点击选择下拉菜单中的最后一项,打开选择标签卡的第三项(字体),如果是无衬线都改为有衬线,如果是有衬线改为无衬线.乱码即可解决(网上一般都是说将有衬线改为无衬线,但是本人的db2安装好之后就是有衬线的,依然乱码,改为无衬线,乱码解决,综合网上的解决方式,如果有乱码无改为有,有改为无即可).二.开机无法启动db2控制中心,报错:DB2 UDP error,DB2JAVIT:RC=9505,解决办法两种:(1).右键单击compute

约瑟夫问题 算法很简单保证每隔人都能看懂用数组实现 利用循环删除数组中的元素

#include<iostream> using namespace std; const int size = 1000; void ArrDel() { int arr[size]; //循环结束标志,一直循环到数组中只剩下最后一个元素结束 int currentNum = size; int count = 0; for (int k = 0; k < size; k++) { arr[k] = k; } //currentNum==1表示数组中只剩下最后一个元素 是循环结束的标志

任何人都能看懂的TensorFlow介绍

本文经机器之心(微信公众号:almosthuman2014)授权转载,禁止二次转载 原文链接:任何人都能看懂的TensorFlow介绍 深度 | 机器学习敲门砖:任何人都能看懂的TensorFlow介绍 2016-08-21 机器之心 选自 kdnuggets 作者:Soon Hin Khor 机器之心编译 参与:Rick.吴攀.李亚洲 本文是日本东京 TensorFlow 聚会联合组织者 Hin Khor 所写的 TensorFlow 系列介绍文章的前两部分,自称给出了关于 TensorFlo

hdu 1024 Max Sum Plus Plus 小白都可以看得懂的解析

这道题弄了很久,网上的很多都看不懂,所以想要写一个像我这种菜鸟都可以看得懂的解析. 题意是将一个长度为n的序列,分成m段不相交叉的子段,使得他们的和最大. 于是可以用dp[i][j]来表示在前j个数中,以num[j]结尾并分为i段的最大和.此时我们可以得出一个式子,dp[i][j]=max(dp[i-1][k]+a[j],dp[i][j-1]+a[j])  (i-1< k< j-1).分别表示num[j]单独成段和num[j]加入以num[j-1]结尾的一段. 现在举一个例子,序列为-1,4,

hdu 5706 GirlCat(深搜)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5706 --报考杭州电子科技大学! GirlCat Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 132    Accepted Submission(s): 104 Problem Description As a cute girl,

HDU 5706 GirlCat (DFS,暴力)

题意:给定一个n*m的矩阵,然后问你里面存在“girl”和“cat”的数量. 析:很简单么,就是普通搜索DFS,很少量.只要每一个字符对上就好,否则就结束. 代码如下: #include <cstdio> #include <string> #include <cstdlib> #include <cmath> #include <iostream> #include <cstring> #include <set> #i

hdu 5706 GirlCat(BFS)

As a cute girl, Kotori likes playing ``Hide and Seek'' with cats particularly. Under the influence of Kotori, many girls and cats are playing ``Hide and Seek'' together. Koroti shots a photo. The size of this photo is n×mn×m, each pixel of the photo

新手也能看懂,消息队列其实很简单

消息队列其实很简单 “RabbitMQ?”“Kafka?”“RocketMQ?”...在日常学习与开发过程中,我们常常听到消息队列这个关键词.我也在我的多篇文章中提到了这个概念.可能你是熟练使用消息队列的老手,又或者你是不懂消息队列的新手,不论你了不了解消息队列,本文都将带你搞懂消息队列的一些基本理论.如果你是老手,你可能从本文学到你之前不曾注意的一些关于消息队列的重要概念,如果你是新手,相信本文将是你打开消息队列大门的一板砖. 一 什么是消息队列 我们可以把消息队列比作是一个存放消息的容器,当

磁盘分区就是这么简单,电脑小白都能看懂的磁盘分区教程!

原文链接: https://xiaoheidiannao.com/articles/Disk-Partition.html 对于新安装的系统,可能只有C盘,如果软件安装和文件存放都在C盘进行的话就会很乱,找文件也比较麻烦. 作为电脑用户养成电脑使用的好习惯是很有必要的,对磁盘进行分区就是个好习惯.简单来说,磁盘分区就是将一个盘符拆分为多个盘符.而盘符一般都用字母表示且不能重复,例如我们经常说的C盘,还有D盘,E盘等等.当然还可以给这些盘符起个名字(卷标),例如C盘卷标为系统盘等等. 一般来说,推