zoukankan      html  css  js  c++  java
  • hdu 1515 dfs

    一道不错的搜索题

    题意:告诉你两个字符串a和b,要求对a进行栈的操作而产生b串,输出操作的顺序,如果有多组输出就按字典序输出。

    Sample Input

    madam
    adamm
    bahama
    bahama
    long
    short
    eric
    rice
    Sample Output
    [
    i i i i o o o i o o 
    i i i i o o o o i o 
    i i o i o i o i o o 
    i i o i o i o o i o 
    ]
    [
    i o i i i o o i i o o o 
    i o i i i o o o i o i o 
    i o i o i o i i i o o o 
    i o i o i o i o i o i o 
    ]
    [
    ]
    [
    i i o i o i o o 
    ]

    这道搜索题不太好理解,通过输出中间变量来辅助理解,这里是第一个例子
    [
    0 0 0
    1 0 1
    2 0 2
    3 0 3
    4 0 4
    5 0 5  //到这里madam全部进入栈中
    4 1 5  //5 0 5状态均不符合任何if,退出,由 4 0 4 开始,符合最后一个条件
    5 1 6  //符合第二个if,之后不符合任何条件,由4 1 5开始
    4 2 6
    5 2 7
    4 3 7
    5 3 8
    5 4 9
    5 5 10
    i i i i o o o i o o
    4 4 8
    5 4 9
    5 5 10
    i i i i o o o o i o
    2 1 3
    3 1 4
    4 1 5
    5 1 6
    3 2 5
    4 2 6
    5 2 7
    4 3 7
    5 3 8
    5 4 9
    5 5 10
    i i o i o i o i o o
    4 4 8
    5 4 9
    5 5 10
    i i o i o i o o i o
    ]
     1 #include<cstdio>
     2 #include<iostream>
     3 #include<algorithm>
     4 #include<cstring>
     5 #include<cmath>
     6 #include<queue>
     7 #include<stack>
     8 using namespace std;
     9 int n,m,t;
    10 int len1,len2;
    11 int num[500];
    12 char s1[500],s2[500] ;
    13 stack<int> q;
    14 int tot=0;
    15 void dfs(int i,int j,int k) //s1的状态,s2的状态,当前栈的元素数目
    16 {
    17     //printf("%d %d %d
    ",i,j,k);
    18     if(j==len2)
    19     {
    20         for(i=0;i<k;i++)
    21         {
    22             if(num[i])  printf("i ");
    23             else printf("o ");
    24         }
    25         printf("
    ");
    26         return;
    27     }
    28     if(i<len1)
    29     {
    30         q.push(s1[i]);
    31         num[k]=1;
    32         dfs(i+1,j,k+1);
    33         q.pop();
    34     }
    35     if(!q.empty()&&q.top()==s2[j])
    36     {
    37         char ss=q.top();
    38         q.pop();
    39         num[k]=0;
    40         dfs(i,j+1,k+1);
    41         q.push(ss);
    42     }
    43 }
    44 int main()
    45 {
    46     int i,j,k;
    47     //freopen("1.in","r",stdin);
    48     while(scanf("%s%s",s1,s2)!=EOF)
    49     {
    50         len1=strlen(s1);
    51         len2=strlen(s2);
    52         printf("[
    ");
    53         dfs(0,0,0);
    54         printf("]
    ");
    55     }
    56     return 0;
    57 }
  • 相关阅读:
    Linux| 系统管理命令
    Linux | 文件编辑命令
    Linux | 权限管理命令
    Linux | 文件管理命令
    Linux | 帮助命令
    前端性能优化之防抖、节流
    css盒子模型
    linux常用命令(持续更新)
    Vue ERROR TypeError: Cannot read property 'upgrade' of undefined
    hbuilder-x使用js-beautiful格式化代码
  • 原文地址:https://www.cnblogs.com/cnblogs321114287/p/4282363.html
Copyright © 2011-2022 走看看