1. 程式人生 > >ZOJ 1004 Anagrams by Stack

ZOJ 1004 Anagrams by Stack

style 現場 實現 zoj anagram show eof int OS

Anagrams by Stack

題目鏈接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=1004

題意:通過堆棧實現將一個字符串轉變成目標字符串的操作,要求輸出全部的可能操作組合。

思路:利用深度優先的搜索思路,對於每一個狀態都有入棧和出棧兩種可能的操作,由於要求按字典序輸出,每次先考慮入棧再考慮出棧。即“能入就入,不能入考慮是否能退,隨後返回上一步”。

下面貼代碼:

 1 //Problem Name: Anagrams by Stack
 2 //Source: ZOJ 1004
 3 //Author: jinjin18
 4 //Main idea: DFS
5 //Language: C++ 6 //========================================================= 7 #include<stdio.h> 8 #include<string.h> 9 10 char origin[1000]; 11 char target[1000]; 12 char temp[1000]; 13 int top = -1; 14 char opt[2005]; 15 int iopt; 16 int popn,pushn; 17 int len; 18 void DFS(){ 19 if(popn == len){
20 for(int i = 0; i < 2*len; i++){ 21 printf("%c ",opt[i]); 22 } 23 printf("\n"); 24 return ; 25 } 26 27 if(pushn < len){ 28 top++; 29 temp[top] = origin[pushn]; 30 pushn++; 31 opt[iopt] = i; 32 iopt++;
33 DFS(); 34 iopt--; 35 top--; 36 pushn--; 37 } 38 39 if(popn < pushn&& temp[top] == target[popn]){ 40 top--; 41 popn++; 42 opt[iopt] = o; 43 iopt++; 44 DFS(); 45 iopt--; 46 top++; 47 popn--; 48 temp[top] = target[popn]; //保護現場 49 } 50 return ; 51 } 52 53 int main(){ 54 55 56 while(scanf("%s%s",origin,target)!=EOF){ 57 popn = pushn = 0; 58 iopt = 0; 59 len = strlen(origin); 60 printf("[\n"); 61 DFS(); 62 printf("]\n"); 63 } 64 65 return 0; 66 }

ZOJ 1004 Anagrams by Stack