• hdu 1515 Anagrams by Stack 栈 回溯


    http://acm.hdu.edu.cn/showproblem.php?pid=1515

     

    http://www.cnblogs.com/liuqidong/archive/2010/07/26/1785076.html

    本题并不是很难,就是输出所有能够目标WORD的可能。所以dfs+stack很容易解决。递归时有两种情况:

    第一:两个字符不相等(即栈顶字符与目标字符不相等);这种情况很容易处理,将匹配word的下一个字符入栈,指针向后挪已为继续递归。

    第二:两个字符相等(即栈顶字符与目标字符相等);这种情况有两种选择

          (1)字符出栈,并将目标word的指针向后挪一位,继续递归;

          (2)将匹配word的下一个字符入栈,指针向后挪一位,继续递归;

    每一次递归用path记录下来路径。当目标word的指针超过最后一位了,说明成功,此时将path输出。

     
    #include<stdio.h>
     #include<string.h>
    #include<stack>
    using namespace std;
    char str1[1005],str2[1005];int len1,len2;
    char path[2005];
     void test(int x,int y,stack<char> st,int t)
     {
          int j;
         if(y==len2)
         {
             printf("i ");
             for(j=0;j<t;j++)
                 printf("%c ",path[j]);
             printf("\n");
             return ;
         }
         if(st.empty ())
         {
             st.push(str1[x+1]);
             path[t]='i';
             test(x+1,y,st,t+1);
             st.pop();
             return ;
         }
         char cur=st.top ();
         if(x==len1 && cur!=str2[y])
             return ;
         if(cur!=str2[y])
         {
             st.push(str1[x+1]);
             path[t]='i';
             test(x+1,y,st,t+1);
             st.pop();
         }
         if(cur==str2[y])
         {
             st.push(str1[x+1]);
             path[t]='i';
             test(x+1,y,st,t+1);
             st.pop();
             st.pop();
             path[t]='o';
             test(x,y+1,st,t+1);
             st.push(str1[x]);
         }
         return ;
     }
     int main()
     {
         int i,j;
         while(scanf("%s%s",str1,str2)!=EOF)
         {
             len1=strlen(str1);
             len2=strlen(str2);
             printf("[\n");
             if(len1<len2)
             {
                 printf("]\n");
                 continue;
             }
             stack<char> st;
             st.push(str1[0]);
             test(0,0,st,0);
             printf("]\n");
         }
         return 0;
     }
  • 相关阅读:
    Linux find 用法示例
    PostgreSQL 之 yum安装 postgis 插件
    解决sql中上下左右backspace不能用的方法
    MySQL 之 MySQL数据库的优化
    mysql命令行批量插入100条数据命令
    MySQL 之 MyTop实时监控MySQL
    MySQL 之 mysqlbinlog解析binlog乱码问题解密
    MySQL 之数据库增量数据恢复案例
    Mysql 之多实例 安装以及配置
    mysql 之审计 init-connect+binlog完成审计功能
  • 原文地址:https://www.cnblogs.com/zxj015/p/2740255.html
Copyright © 2020-2023  润新知