zoukankan      html  css  js  c++  java
  • HDU 1181 变形课 (深搜)

    题目连接

    Problem Description

    呃......变形课上Harry碰到了一点小麻烦,因为他并不像Hermione那样能够记住所有的咒语而随意的将一个棒球变成刺猬什么的,但是他发现了变形咒语的一个统一规律:如果咒语是以a开头b结尾的一个单词,那么它的作用就恰好是使A物体变成B物体.
    Harry已经将他所会的所有咒语都列成了一个表,他想让你帮忙计算一下他是否能完成老师的作业,将一个B(ball)变成一个M(Mouse),你知道,如果他自己不能完成的话,他就只好向Hermione请教,并且被迫听一大堆好好学习的道理.

    Input
    测试数据有多组。每组有多行,每行一个单词,仅包括小写字母,是Harry所会的所有咒语.数字0表示一组输入结束.

    Output
    如果Harry可以完成他的作业,就输出"Yes.",否则就输出"No."(不要忽略了句号)

    Sample Input

    so
    soon
    river
    goes
    them
    got
    moon
    begin
    big
    0

    Sample Output
    Yes.
    Harry 可以念这个咒语:"big-got-them".

    分析:
    成语接龙的游戏相信大家都玩过把,这道题的意思和成语接龙一样,就是要求我们以某一个字母作为一个单词的开头,然后找以这个单词的结尾的字母作为开头的另一个单词,知道找到我们要求找的那个作为结尾的单词为止。

    这是搜索专题里面的一道题,刚开始的时候完全想的就是暴力走一波,试了试竟然过了。

    但是毕竟是搜索专题吗,总得用搜索的方法来解决才对得起这个专题名。

    暴力代码:

    #include<iostream>
    #include <stdio.h>
    #include <string.h>
    using namespace std;
    int a[26][26];
    int main()
    {
        char s[100],i,j,k;
        while (scanf(" %s",s)!=EOF)
        {
            if(s[0]=='0')
            {
                for (k=0; k<26; k++)
                    for (i=0; i<26; i++)
                    {
                        if (a[i][k]==1)
                            for (j=0; j<26; j++)
                                if (a[k][j]==1)
                                    a[i][j]=1;
                    }
                if (a[1]['m'-'a']==1)
                    printf("Yes.
    ");
                else printf("No.
    ");
                memset(a,0,sizeof(a));
            }
            else
                a[s[0]-'a'][s[strlen(s)-1]-'a']=1;
        }
        return 0;
    }
    

    虽然个人觉得这道题用暴力的方法简单、易懂,但是还是要满足一下下搜索专题的要求的。

    #include <iostream>
    #include <cstring> 
    using namespace std;
     
    struct node
    {
        int v; //为1时即表示可到达
    
        int f; //DFS中为1表示已走过
    
    };
    int prove;
    node a[26][26]; //a[i][j]表示i节点到j节点
    void DFS(node a[][26], int start) 
    {
        int i;
        if(prove == 1) //已证明
            return ;
        if(start == 12) //如果表下个开始节点为12即OK啦
        {
            cout << "Yes." << endl;
            prove = 1;
            return ;
        }
        for(i = 0; i < 26; i++)
        if(i == start)
            continue;
        else
        {
            if(a[start][i].v == 1 && a[start][i].f == 0)
            {
                a[start][i].f = 1; //该节点已走过
                
                DFS(a, i);
                
                a[start][i].f = 0; //还原该节点
            }
        }
        return ;
    }
    int main()
    {
        char s[100];
        int l, t1, t2;
        memset(a, 0, sizeof(a)); //初始化全部为0
        prove = 0;
        while( gets(s) )
        {        
            if(s[0] == '') 
                break;
           
            if(s[0] == '0') //为0时就进入DFS中
            {
                DFS(a, 1);
                if(prove == 0)
                  cout << "No." << endl;
                
                memset(a, 0, sizeof(a)); //记得再次初始化
                prove = 0;
            }
       else
       { 
        l = strlen(s);
                t1 = s[0] - 'a'; //转换为0--25的节点
                t2 = s[l -1] - 'a';
                a[t1][t2].v = 1; //t1到t2有通路
       }
        }
        return 0;
    }
    
  • 相关阅读:
    Java中的 多线程编程
    Python中的字典详解
    Python中的数据类型
    Python中的字符串操作总结(Python3.6.1版本)
    R语言绘制沈阳地铁线路图
    HIVE中的order by操作
    Hive中order by,sort by,distribute by,cluster by的区别
    HDFS shell命令
    HDFS入门
    Bootstrap_Datatable Ajax请求两次问题的解决
  • 原文地址:https://www.cnblogs.com/cmmdc/p/7610856.html
Copyright © 2011-2022 走看看